Подтвердить что ты не робот

Труба Unix в ls

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

which studio | ls -l

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

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

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

4b9b3361

Ответ 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 - длина этого массива.