Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: canar40 в Dec 13, 2009, 23:25



Титла: Command substitution & pipe
Публикувано от: canar40 в Dec 13, 2009, 23:25
Здравейте :)

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

cat count.txt | wc -w
wc -w 'cat count.txt'


Титла: Re: Command substitution & pipe
Публикувано от: b2l в Dec 13, 2009, 23:41
Разликата а? Ами правата чертичка - хахахаха. Или piping т.е изхода на една команда служи за вход на друга.


Титла: Re: Command substitution & pipe
Публикувано от: canar40 в Dec 14, 2009, 11:13
Разликата а? Ами правата чертичка - хахахаха. Или piping т.е изхода на една команда служи за вход на друга.

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


Титла: Re: Command substitution & pipe
Публикувано от: b2l в 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


Титла: Re: Command substitution & pipe
Публикувано от: neter в 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


Титла: Re: Command substitution & pipe
Публикувано от: canar40 в Dec 14, 2009, 12:45
благодаря много за отговора.. трябва да се внимава с кавичките :)


Титла: Re: Command substitution & pipe
Публикувано от: bop_bop_mara в 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


Титла: Re: Command substitution & pipe
Публикувано от: romeo_ninov в Dec 17, 2009, 10:13
Само да вметна по спомени че първата команда пуска subshell за да изпълни това в обратните кавични, докато второто с изпълнява в един ше.


Титла: Re: Command substitution & pipe
Публикувано от: bop_bop_mara в Dec 17, 2009, 21:48
Шела не пуска ли по един процес (дете) за всяко нещо, което трябва да exec-не? Т.е. и в 2та случая трябва да пусне по още 2 процеса, само че в единия случай изчаква завършване и резултат от единия за ползване в другия, а в другия случай слага пайпче между тях? Всъщност наистина, как е имплементирано пренасочването на стандартен вход от низ? ::)


Титла: Re: Command substitution & pipe
Публикувано от: radoulov в 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


Титла: Re: Command substitution & pipe
Публикувано от: bop_bop_mara в Dec 18, 2009, 00:44
Дам, знам, че може да се (накара да се) изпълни по 2 начина (в субшел или в текущия). И да, heredoc-a имах пред вид. Е явно не бъркам  [_]3 [_]3 [_]3


Титла: Re: Command substitution & pipe
Публикувано от: laskov в Mar 02, 2010, 12:53
Оказа се, че clamscan не иска да сканира tar архив. Как да го стартирам в pipe с tar ?