Труба Unix в ls
Я думал, что до сих пор понял nix-каналы... У меня есть исполняемый файл под названием studio
, который символизирует мою установку Android Studio
, и я предположил, что могу получить связанное местоположение с
which studio | ls -l
Но это не работает. То, что это дает мне, эквивалентно просто запустить ls -l
в текущем каталоге.
Если я запустил which studio
, я получаю /home/me/bin/studio
. И если я запустил ls -l /home/me/bin/studio
, я получу ожидаемый результат, показывая мне расположение символической ссылки.
Так почему же не работает версия с каналами? Что я не собирал о трубах?
Ответы
Ответ 1
Для этого вам нужно xargs
:
which studio | xargs ls -l
От man xargs
:
xargs - создавать и выполнять командные строки со стандартного ввода
Чтобы полностью понять, как работают трубы, вы можете прочитать Что такое простое объяснение того, как работают трубы в BASH?:
Канал Unix подключает дескриптор файла STDOUT (стандартный вывод) первый процесс для STDIN (стандартный ввод) второго. Какие происходит тогда, когда первый процесс записывает в STDOUT, что вывод может быть немедленно прочитан (из STDIN) вторым процессом.
Ответ 2
ls
не считывает свои аргументы из стандартного ввода, а из командной строки. Чтобы получить каталог в командной строке, вы должны использовать подстановку команд:
ls -l "$( which studio )"
(Двойные кавычки необходимы, если путь может содержать пробелы.)
Ответ 3
Так как ls -l
не принимает никакого ввода, он ничего не делает для вывода which studio
. Здесь важно понять разницу между стандартным вводом и аргументами. Стандартный ввод - это специальный файл, который считывается с помощью процедуры scanf
(например, программой на C), а аргументы программы передаются основной процедуре в качестве параметров argv
и argc
. argv
- массив массивов с нулевым завершением char, а argc
- длина этого массива.