Próbuję użyć xargs, aby uruchomić polecenie dla każdego dostarczonego argumentu, ale niestety flaga --replace / -I nie działa poprawnie po połączeniu z -n. Wygląda na to, że {} rozwinie się do pełnej listy argumentów odczytanych ze standardowego wejścia, niezależnie od opcji -n.
Niestety, wszystkie przykłady w sieci wydają się dotyczyć poleceń (mv, cp, rm), które przyjmą wiele argumentów w przypadku rozszerzenia {}.
Na przykład podczas uruchamiania:
echo a b c d | xargs -n 1 -I {} echo derp {}
Dane wyjściowe to:
derp a b c d
Ale spodziewałem się:
derp a
derp b
derp c
derp d
Jednak uruchomienie go bez opcji -I {} daje oczekiwany wynik:
echo a b c d | xargs -n 1 echo derp
derp a
derp b
derp c
derp d
Czy jest jakiś sposób na osiągnięcie tego za pomocą xargs? Moim ostatecznym zamiarem jest użycie go do uruchamiania wielu sesji ssh, takich jak
echo server{1..90} | xargs -n 1 -P 0 -I {} ssh {} 'echo $SOME_HOST_INFO'
Biegnę xargs (GNU findutils) 4.4.2
na RHEL 6.3.
xargs
, ale nie GNUxargs
.man xargs
na-I
:Also, unquoted blanks do not terminate input items; instead the separator is the newline character. Implies -x and -L 1.
Więc zachowuje się zgodnie z przeznaczeniem.Odpowiedzi:
Możesz wyświetlać nowe wiersze, aby osiągnąć oczekiwany wynik. W twoim przypadku z rozszerzeniem serwera byłoby to:
źródło
zsh
... Naprawiłem moją odpowiedź.echo
potrzebuje-e
opcji.Możesz skorzystać z dodatkowej rury takiej jak ta,
Pośrednie użycie xargs „echa” każdej litery „abcd” indywidualnie z powodu opcji „-n1”. To umieszcza każdą literę w jej własnej linii, tak jak to,
Ważne jest, aby zrozumieć, kiedy używasz -I (zamiana łańcucha), xargs implikuje -L, który wykonuje polecenie narzędzia (w twoim przypadku echo) raz na linię. Nie można również użyć opcji -n z opcją -L, ponieważ wzajemnie się wykluczają.
źródło