Автор Тема: Command substitution & pipe  (Прочетена 4042 пъти)

canar40

  • Участници
  • ***
  • Публикации: 3
    • Профил
Command substitution & pipe
« -: Dec 13, 2009, 23:25 »
Здравейте :)

Имам 1 проблем.. разбрах 2-те неща какво представляват, но нещо не ми е много ясно каква е разликата:

cat count.txt | wc -w
wc -w 'cat count.txt'
« Последна редакция: Dec 13, 2009, 23:28 от canar40 »
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: Command substitution & pipe
« Отговор #1 -: Dec 13, 2009, 23:41 »
Разликата а? Ами правата чертичка - хахахаха. Или piping т.е изхода на една команда служи за вход на друга.
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

canar40

  • Участници
  • ***
  • Публикации: 3
    • Профил
Re: Command substitution & pipe
« Отговор #2 -: Dec 14, 2009, 11:13 »
Разликата а? Ами правата чертичка - хахахаха. Или piping т.е изхода на една команда служи за вход на друга.

мисълта ми беше, че не мога да разбера има ли смислова разлика между двете.. и ако да, каква? :)
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: Command substitution & pipe
« Отговор #3 -: Dec 14, 2009, 11:15 »
Абе пич, на мен двете команди ми вадят два различни резултата:
Код:
# wc -w `cat log `
 1087566 /root/Tutorial.Adobe.Premiere.Pro.2.0.pdf
  410308 /mnt/D_DISK/Tutorial.Adobe.Premiere.Pro.2.0.pdf
 1497874 total
# cat log | wc -w
2
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: Command substitution & pipe
« Отговор #4 -: Dec 14, 2009, 11:31 »
Код
GeSHi (Bash):
  1. wc -w 'cat count.txt'
Тази команда е грешна. Този тип кавички предполагат, че името на файла, който wc трябва да погледне, се казва 'cat count.txt', а такъв файл най-вероятно няма. В този тип кавички cat няма да се изпълни като команда, а ще се зачете като част от името на файла. Ако се използват другите кавички, които backtolife е използвал, командата отново е грешна. Така или иначе wc работи с файлове и може да му се подаде директно като параметър името на файла, вместо да се извежда с cat. Извеждането с cat в структурата на wc може да доведе до грешка в изпълнението на командата, тъй като части от изхода на cat ще влязат като параметри към wc, които (в повечето случаи) не съществуват или не са нужни.
Практическата разлика между следните две команди
Код
GeSHi (Bash):
  1. wc -w count.txt
  2. cat count.txt | wc -w
е само една - самостоятелното изпълнение на wc извежда и името на файла, което, ако става дума за информативно извеждане, е удобно, но ако ни е нужна само стойността на броя думи, ще трябва името на файла да се изрязва от изхода на командата. Практически еквивалентни команди са
Код
GeSHi (Bash):
  1. wc -w count.txt | cut -d' ' -f1
  2. cat count.txt | wc -w
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

canar40

  • Участници
  • ***
  • Публикации: 3
    • Профил
Re: Command substitution & pipe
« Отговор #5 -: Dec 14, 2009, 12:45 »
благодаря много за отговора.. трябва да се внимава с кавичките :)
Активен

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Re: Command substitution & pipe
« Отговор #6 -: Dec 16, 2009, 22:54 »
Сега 1во, както backtolife е отбелязал скрито, command substitution се прави между обратни кавички: `
2ро погледни мн добре man wc, и си помисли какво му казваш със
Код
GeSHi (Bash):
  1. wc -w `cat filename`
3то, относно това дали да ползваме
Код
GeSHi (Bash):
  1. cat filename | command
вместо да речем
Код
GeSHi (Bash):
  1. command <<<"`cat filename`"
- когато файлът ти е 20 ГБ ще осъзнаеш разликата и ползата от 1вото. Pipe е програмен канал между два процеса, те си вървят паралелно и единият пише на другия. За второто /ако не се лъжа/ шела първо експандва командата и си запазва съответния стринг, чак след това го подава на стандартния вход на основната команда. Само че 20ГБ стринг е трудно нещо.
Все пак, чети добре man-овете за вградените опции в командите. Например
Код
GeSHi (Bash):
  1. cat filename | grep "bla" | wc -l
може спокойно да е
Код
GeSHi (Bash):
  1. grep -c "bla" filename
Активен

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
Re: Command substitution & pipe
« Отговор #7 -: Dec 17, 2009, 10:13 »
Само да вметна по спомени че първата команда пуска subshell за да изпълни това в обратните кавични, докато второто с изпълнява в един ше.
Активен

0x2B|~0x2B

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Re: Command substitution & pipe
« Отговор #8 -: Dec 17, 2009, 21:48 »
Шела не пуска ли по един процес (дете) за всяко нещо, което трябва да exec-не? Т.е. и в 2та случая трябва да пусне по още 2 процеса, само че в единия случай изчаква завършване и резултат от единия за ползване в другия, а в другия случай слага пайпче между тях? Всъщност наистина, как е имплементирано пренасочването на стандартен вход от низ? ::)
Активен

radoulov

  • Напреднали
  • *****
  • Публикации: 116
    • Профил
Re: Command substitution & pipe
« Отговор #9 -: Dec 17, 2009, 23:38 »
Цитат
Шела не пуска ли по един процес (дете) за всяко нещо, което трябва да exec-не?
Т.е. и в 2та случая трябва да пусне по още 2 процеса, само че в единия случай изчаква
завършване и резултат от единия за ползване в другия, а в другия случай слага пайпче между тях?

По принцип е така.
Зависи от shell обвивката, която използваш.
Някои обвивки (AT&T ksh, zsh) изпълняват последната команда в pipeline в началната (current) shell обвивка (без да стартират subshell)
в случаите, когато тя е builtin команда (например read).

Код:
% bash -c 'echo ok|read;echo $REPLY'                              

% ksh93 -c 'echo ok|read;echo $REPLY'
ok
% pdksh -c 'echo ok|read;echo $REPLY'

% zsh -c 'echo ok|read;echo $REPLY'
ok


Цитат
Всъщност наистина, как е имплементирано пренасочването на стандартен вход от низ?

Не знам, дали разбирам правилно въпроса (дали имаш предвид here strings),
може би определението в man page е достатъчно:

Код:
man bash|less -pHere\ String
Here Strings
       A variant of here documents, the format is:

              <<<word

       The word is expanded and supplied to the command on its standard input.
     
За по-подробна информация, можеш да пробваш:

Код:
truss/strace -f command <<< here string
« Последна редакция: Dec 18, 2009, 00:23 от radoulov »
Активен

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Re: Command substitution & pipe
« Отговор #10 -: Dec 18, 2009, 00:44 »
Дам, знам, че може да се (накара да се) изпълни по 2 начина (в субшел или в текущия). И да, heredoc-a имах пред вид. Е явно не бъркам  [_]3 [_]3 [_]3
Активен

laskov

  • Напреднали
  • *****
  • Публикации: 3166
    • Профил
Re: Command substitution & pipe
« Отговор #11 -: Mar 02, 2010, 12:53 »
Оказа се, че clamscan не иска да сканира tar архив. Как да го стартирам в pipe с tar ?
Активен

Не си мислете, че понеже Вие мислите правилно, всички мислят като Вас! Затова, когато има избори, идете и гласувайте, за да не сте изненадани после от резултата, и за да не твърди всяка партия, че тя е спечелила, а Б.Б. (С.С., ...) е загубил, а трети да управлява.  Наздраве!  [_]3

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
broken pipe?
Настройка на хардуер
worthless 4 2747 Последна публикация Jul 14, 2004, 19:06
от worthless
EHLO: Command unrecognized
Настройка на програми
flame 5 2925 Последна публикация Aug 12, 2014, 13:21
от BRADATA
EHLO: Command unrecognized
Хардуерни и софтуерни проблеми
flame 5 2599 Последна публикация Jan 04, 2005, 09:51
от laskov
RQ: Търся играта Missile Command
Общ форум
kill_u 3 2610 Последна публикация Jan 19, 2006, 16:02
от kennedy
Make command - проблем
Настройка на програми
nushe 14 4792 Последна публикация May 20, 2006, 22:39
от nushe