2017-02-15 4 views
3

Так я учусь о трубах в Баш и я нашел это содержательное описание:Труба printf для ls в Bash?

UNIX-труба соединяет STDOUT (стандартный вывод) файловый дескриптор первого процесса в STDIN (стандартный ввод) из второй. То, что происходит , заключается в том, что, когда первый процесс записывает в его STDOUT, вывод может быть немедленно прочитан (из STDIN) вторым процессом.

Source

Учитывая это понимание, давайте подключить STDOUT из printf к STDIN из ls. Для простоты напечатайте родительский каталог (printf ..).

~/Desktop/pipes$ mkdir sub 
~/Desktop/pipes$ ls 
sub 
~/Desktop/pipes$ cd sub 
(no files) 
~/Desktop/pipes/sub$ printf .. | ls 
(no files) 
~/Desktop/pipes/sub$ 

Я хочу делать: ls .. но мне кажется, что все, что я получаю ls. Почему это так? Как я могу установить ls родительский каталог с помощью труб? Я неправильно понимаю трубы?

+2

'ls' не читается со стандартного ввода. Итак, 'ls ..' - это способ получить то, что вы хотите здесь. 'man ls' - ваш друг. – codeforester

+0

Так это просто свойство 'ls'? Является ли мое понимание труб в противном случае правильным? Является ли 'ls ..' не принимать аргумент' ..' от STDIN? –

+0

Вам нужно использовать 'xargs' с' ls' @KennethWorden – Inian

ответ

2

Многие программы не читаются с stdin, а не только ls. Также возможно, что программа может не записываться в stdout.

Вот небольшой эксперимент, который может прояснить ситуацию. Выполните следующие действия:

cat > file1 
This is file1 
^D 

Символ^D является вы нажатием <CTRL>+D, который конца-файла по умолчанию. Итак, сначала мы вызываем программу cat и перенаправляем ее stdout на file1. Если вы не укажете имя входного файла, оно будет считаться с stdin, поэтому мы наберем «Это файл1».

Теперь сделать то же:

cat > file2 
This is file2 
^D 

Теперь, если вы:

cat < file1 

Вы получаете:

This is file1 

что, если вы:

cat file1 | cat file2 

или:

cat file2 < file1 

Почему?Потому что если вы укажете входное имя файла, то программа cat не будет читать stdin, как и ls.

Теперь, как насчет:

cat - file1 < file2 

По соглашению, - означает стандартный поток, stdin при чтении или stdout при написании.

2

Проблема ls не читается с stdin, как вы намеревались. Вы должны использовать инструмент, который считывает из stdin как xargs и подачи на вход считывания в ls

printf "someSampleFolderOrFile" | xargs ls 

xargs man странице

xargs - строить и выполнять командные строки из стандартного ввода

+0

Мой вопрос был больше о том, как работают трубы, но спасибо за ваш ответ. –

Смежные вопросы