Потрібно розібратися в понятті xargs і pipe


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?


У мене немає часу на тривалу відповідь, але я stdoutможу виступати як підрив, якщо оболонка підтримує процес заміщення .
slhck

Я написав це на суперпользователе, але це може допомогти: виведення труби в іншу команду
Rich Homolka

Відповіді:


3

ваш приклад досить заплутаний.

Зазвичай ви не надсилаєте кішкам жодних символів.

Ви зазвичай надсилаєте файл кішці.

Тим не менш, коли ви надсилаєте деяких персонажів кішці, вона друкує символів.

$ echo abc12123 | cat
abc12123

Зазвичай ви надсилаєте ім'я файлу cat

$ 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


Чи є спосіб мені сказати, чи певна команда також відправить вихід як параметр?
MistyD

@MistyD так, echo asdfsd | commandі command asdfasdf, і подивіться, що це робить. Це простіше, ніж читати довгу сторінку чоловіка, інакше. але ти вчишся, намагаючись і читати.
барлоп

Що стосується того, коли використовувати xargs, я думаю, якщо у вас є команда, і ви не можете передати її, і ви хочете відправити на неї вихід команди, і він бере лише параметр, то ви можете використовувати xargs . або я гадаю, підміна команд. Особисто я думаю, що я, можливо, використовував xargs один раз у Windows cmd, щоб дозволити мені надсилати інформацію з команди, до пакетного файлу (сценарію), який я написав. Я не міг передати свій пакетний файл, але мій пакетний файл міг прийняти параметр. Оболонка Windows cmd не має підміну, тому я думаю, що я отримав копію xargs і використав це.
барлоп

У cmd використовується команда 'for', яка може надіслати висновок команди іншій команді, як параметр, але рішення Linux - xargs виглядає акуратніше, і ви можете отримати xargs для Windows. Так було, коли я використовував xargs.
барлоп

Джон наводить хороший приклад на основі вашого .. кішка, можливо, незвична в тому, що трубопровід до неї має інший ефект від надання параметру, тому, якщо ви хотіли передати коту, але це має ефект передачі його як параметра, то використовувати xargs. наприклад, ви хочете передати ім'я файлу cat, але виведіть вміст файлу.
барлоп

6

Наступна команда не виходить з ладу. Він просто робить те, чого ви не очікували:

readlink -f SUService.log | cat

Коли catйому надається stdin, він копіює його в stdout. Він не шукає в ньому назви файлів.

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

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

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

readlink -f SUService.log | xargs cat

дякую за пояснення, але я шукаю, коли мені потрібно використовувати команду xarg?
MistyD

2
Використовуйте, xargsколи ви хочете використовувати stdin як аргументи в командному рядку. echo filename | xargs catте саме, що cat filename.
John1024

2

Погляньте на маніпуляції для кота та на 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.

відлуння | xargs cat

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.