2013-08-13 3 views
29

Я думал, что я не понял * NIX трубы до сих пор ... У меня есть исполняемый файл с именем studio который символические ссылками в мою установке Android Studio и я предполагал, что я мог получить связной в место сUnix труба в Ls

which studio | ls -l 

Но это не работает. То, что это дает мне, эквивалентно простому запуску ls -l в текущем каталоге.

Если я запустил which studio, я получаю /home/me/bin/studio. И если я запустил ls -l /home/me/bin/studio, я получаю ожидаемый результат, показывая мне расположение символической ссылки.

Так почему же не работает версия для труб? Что я не собирал о трубах?

ответ

42

Для этого вам нужно xargs:

which studio | xargs ls -l 

От man xargs:

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

Чтобы полностью понять, как работают трубы, вы можете читать What is a simple explanation for how pipes work in BASH?:

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

16

ls не считывает свои аргументы из стандартного ввода, а из командной строки. Чтобы получить каталог в командной строке, вы должны использовать команду подстановки:

ls -l "$(which studio)" 

(двойные кавычки необходимы, если путь может содержать пробелы.)

+1

Ответ на вопрос, связанный с 'xargs', чище, но это отличает цветовое кодирование моей оболочки, что является хорошим благом! – Dannid

1

Поскольку ls -l не принимает никакого вклада, его ничего не делает относительно вывода which studio. Здесь важно понять разницу между стандартным вводом и аргументами. Стандартный ввод - это специальный файл, который считывается с использованием процедуры scanf (например, программой, например, в C), а аргументы программы передаются основной процедуре в качестве параметров и argc. argv - массив массивов с нулевым завершающим символом char, а argc - длина этого массива.

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