Передача аргументу декількома командами в одному рядку


10

Я хотів би мати можливість запускати кілька команд в одному файлі в одному рядку. Я зараз це роблю:

commandA file && commandB file && perl -ne '...' file

Мій інстинкт кишки говорить мені, що повинен бути спосіб надати аргумент імені файлу лише один раз і передавати його обом командам одночасно через xargsщось подібне:

find file | xargs commandA && xargs commandB && xargs perl -ne '...'

Коли я намагаюся це, виконується лише перша команда. Як я можу досягти того, що хочу зробити?

Відповіді:


12

Для цього можна визначити локальну змінну:

f=file; commandA $f && commandB $f && ...

Ви також можете виконати всі беззастережно (замінюючи &&на ;) або паралельно (замінюючи &&на &).

Ви також можете використовувати розширення історії оболонки для посилання на попередні аргументи:

commandA file && commandB !:1 && ...

Не зовсім те, що я мав на увазі, але це цікава альтернатива.
Заїд

Що не так у цій відповіді?
Кріс

Це дійсно круто! Чи є спосіб не визначити нову змінну?
користувач

@user, я додав альтернативу.
maxschlepzig


2

Ви можете використовувати xargs для побудови командного рядка, наприклад:

echo file | xargs -i -- echo ls -l {}\; wc -l {}

Просто перекладіть вище в bash, щоб запустити його:

echo file | xargs -i -- echo ls -l {}\; wc -l {} | bash

Розширення прикладу до всіх файлів * .c у поточному каталозі (уникаючи ls тут, щоб запобігти будь-якій заміні псевдоніму оболонки):

\ls -1 *.c | xargs -i -- echo ls -l {}\; wc -l {} | bash

Використовуйте це, щоб отримати список усіх файлів, що містяться в каталогах, де назва схожа на "enums": find . -name "*enums*" | xargs -i echo -e echo {}\; ls -lh {}\; echo -e '\n\n' | bash
Matt Lachman

1

Я б сам за це не голосував. Це нерозумно і небезпечно, але просто в інтересах перерахування способів цього зробити:

for cmd in "commandA" "commandB" "perl -ne '...'" ; do eval $cmd file ; done

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