3

Я боролся с этой проблемой некоторое время и буду очень признателен, если кто-то сможет прояснить ее для меня. Предположим, я пытаюсь соединить две команды вместе. readlink и cat

readlink Command output
$ readlink -f SUService.log
/cygdrive/c/SUService.log

Теперь, если я попробую что-то подобное

$ readlink -f SUService.log | cat

Пока как то так будет работать

$ readlink -f SUService.log | xargs cat

Я хотел знать, почему это так? Я прочитал этот пост здесь, в котором у ОП был похожий вопрос, и этот пост, который пытается объяснить разницу между аргументом и входными данными, однако я все еще не мог обернуть голову вокруг принятых ответов. Насколько я понимаю, readlink возвращает результат в stdout, который является экраном терминала, в то время как cat хочет ввод в качестве аргумента. Это, в свою очередь, побуждает меня спросить, как узнать, может ли вывод команды (такой как locate или readlink) работать в качестве аргумента или нет для следующей команды? Я больше читаю, и получается, что я хотел бы знать, когда мне следует использовать команду xarg?

3 ответа3

6

Следующая команда не подведет. Он просто делает то, чего вы не ожидали:

readlink -f SUService.log | cat

Когда cat получает стандартный ввод, он копирует его в стандартный вывод. Он не ищет имена файлов в нем.

Кроме того, это будет читать из названного файла:

cat "$(readlink -f SUService.log)"

xargs также поместит имя в командную строку cat , получив тот же результат:

readlink -f SUService.log | xargs cat
3

Ваш пример довольно запутан.

Обычно вы не отправляете кошкам только символы.

Вы обычно отправляете файл в cat.

Тем не менее, когда вы отправляете несколько символов в cat, он печатает символы.

$ echo abc12123 | cat
abc12123

Обычно вы отправляете имя файла кошке

$ cat abc12123
cat: abc12123: No such file or directory

Так что обратите внимание, что сама кошка по-разному работает с забавными персонажами, переданными ей в качестве параметра.

$ cat b.b
textofb.b

$ echo b.b | cat
b.b

$ cat b.b
textofb.b

я приведу более простой пример, чем ваш

$ echo b.b | xargs cat
textofb.b

видеть, что печатает содержимое bb, потому что asdfasdfs | xargs cat , отправит вывод asdfasdfs в качестве параметра cat.

Так

echo b.b | xargs cat   
=  
cat b.b

Принимая во внимание, что echo b.b | cat не такая как cat b.b

2

Взгляните на man-страницы для cat и xargs, чтобы увидеть, что они делают.

man cat

cat - concatenate files and print on the standard output

А также:

man xargs

xargs - build and execute command lines from standard input

Вот небольшая демонстрация

Давайте создадим тестовый файл:

echo "a" > test
echo "b" >> test
echo "c" >> test

кошка

cat test

Читает файл и дает:

a
b
c

эхо | кошка

echo test | cat

По словам man cat , это так же, как:

echo test | cat -

Какие трубы test в stdin кошки, и велит кошке читать из stdin.

эхо | кот ксаргс

echo test | xargs cat

Создает и выполняет следующую команду:

cat test

Результат этого мы уже показали.

Если мы бежим

<test xargs -n1 cat

Xargs видит это на входе:

a
b
c

И он генерирует следующие команды:

cat a
cat b
cat c

Что должно привести к трем ошибкам, так как эти файлы не существуют.

Почему -n1?

Согласно man xargs , -n1 указывает xargs использовать один аргумент (чтение из stdin) в каждой команде, которую он генерирует.

Если вместо этого мы используем -n2 , мы генерируем следующее, которое использует до двух параметров на команду:

cat a b
cat c

И если мы используем -n3 или выше или просто опускаем -n:

< test xargs cat

Мы получаем:

cat a b c

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .