Jak wykonać polecenie wielokrotnie z różnymi argumentami?

11

Jestem na Ubuntu. Skopiowałem kilka argumentów (oddzielonych znakiem nowej linii) i mogę użyć Xsel, aby je wydrukować w ten sposób

$ xsel
arg1
arg2
arg3
arg4
...

Teraz chcę użyć każdego z tych argumentów do innego polecenia i wykonać to polecenie tyle razy, ile jest argumentów.

Więc próbowałem

$ xsel | mycommand "constantArgument" $1

Wykonano to jednak mycommandtylko dla pierwszego argumentu. Jak mogę go wykonać dla każdego argumentu?

Wes
źródło
Edytowałem pytanie, aby odzwierciedlić fakt, że moja komenda ma więcej niż jeden argument.
Wes

Odpowiedzi:

12

Możesz po prostu użyć xargs

xsel | xargs -n1 echo mycommand 

-n1 oznacza jeden argument dla mycommand, ale jest to tylko sucha próba, pokaże, co będzie uruchomione, aby go usunąć echo

Dla stałego argumentu

xsel | xargs -I {} -n1 echo mycommand "constantArgument" {}
Rahul Patil
źródło
Co jeśli „moja komenda” oczekuje więcej niż jednego argumentu, z czego xsel zawiera tylko jeden argument?
Wes
xsel | xargs -n1 echo mycommand -more-arg
Rahul Patil
xsel | xargs -n2 echo mycommanddwa arg na polecenie
Rahul Patil
7
xsel | while read line; do mycommand "$line"; done

Lub coś podobnego. Możesz także użyć xargs, która jest bardzo potężnym poleceniem do manipulacji argumentami wiersza poleceń.

orion
źródło
1

Aby trochę dostosować:

printf "${CMD} %s ${ARG2}\n" `xsel` | sh -n

Możesz usunąć -noexecuteflagę, gdy zobaczysz, jak to działa.

Jeśli to działa, możesz shcałkowicie upuścić i zrobić to zamiast tego:

. <<HERE /dev/stdin
    $(printf "${CMD} %s ${ARG2}\n" `xsel`)
HERE

Lub szybciej:

printf "${CMD} %s ${ARG2}\n" `xsel` | . /dev/stdin

Tak czy inaczej jest łatwe i zrobi to.

mikeserv
źródło