2016-10-31 5 views
0

Я новичок в Linux. Когда я это пробовал, я узнал о команде кота.Конвейеризация команд cat и ls

[email protected]:~$ cat file 
Videos/Arrow/Season* 
[email protected]:~$ cat file | ls -l 

Команда отображает содержание текущей папки вместо папки, указанной в файле .. Но когда я сделал это

[email protected]:~$ cat file 
Videos/Arrow/Season* 
[email protected]:~$ ls -l $(cat file) 

Содержимых ожидаемых дисплеев папок правильно. Почему я не могу использовать трубопровод в этом случае?

+0

вы не можете «пропустить» текст в 'ls' для использования в качестве имен файлов. ls не принимает вход таким образом. вам придется использовать xargs, например. 'cat file | xargs ls -l'. xargs берет данные из stdin и передает его в указанную команду ('ls -l') в качестве аргументов командной строки. –

ответ

0

В первом примере вы передаете вывод cat file на вход ls -l. Поскольку ls -l не принимает никаких данных, он ничего не делает относительно вывода cat file. Однако во втором примере вы используете $(cat file), который помещает вывод cat file вместо аргумента, переданного в ls -l, и на этот раз ls -l имеет текст внутри file в нужном месте для чего-то с ним. Проблема здесь замечает разницу между стандартным входом программы и аргументами программы. Стандартный ввод - это то, что у вас есть, когда вы вызываете scanf в C, например; и аргументы - это то, что вы получаете в указателе argv, переданном как параметр в основную процедуру.