Замена для xargs -d в osx

В Linux вы можете использовать xargs -d, быстро запустить hostname Команда против четырех разных серверов с последовательными именами следующим образом:

echo -n 1,2,3,4 |xargs -d, -I{} ssh root@www{}.example.com hostname

Похоже, что команда OSX xargs не поддерживает параметр разделителя. Можете ли вы достичь того же результата с другим форматом echoили через какую-то другую утилиту командной строки?

3 ответа

Решение

Как насчет:

echo {1..4} | xargs -n1 -I{} ssh root@www{}.example.com hostname

От man xargs:

-n number
Set the maximum number of arguments taken from standard input for each invocation of utility.

Кроме того, вы всегда можете установить GNU xargs через доморощенный и GNU findutils пакет.

Установите Homebrew:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Следуй инструкциям. Затем установите findutils:

brew install findutils

Это даст вам GNU xargs как gxargsи вы можете использовать синтаксис, к которому вы привыкли в GNU/Linux. То же самое относится и к другим основным командам, найденным в пакете findutils, таким как gfind или же glocate или же gupdatedb, которые имеют разные аналоги BSD на OS X.

Вы также можете использовать tr в OSX для преобразования запятых в новые строки и использования xargs для перечисления каждого элемента следующим образом:

echo -n 1,2,3,4 | tr -s ',' '\n' | xargs -I{} ssh root@www{}.example.com hostname

Если вы хотите, чтобы он работал параллельно, используйте GNU Parallel:

parallel ssh root@www{}.example.com hostname ::: {1..4}

С printf

$ printf '%s\n' 1 2 3 4 | xargs -I{} echo ssh root@www{}.example.com hostname
ssh root@www1.example.com hostname
ssh root@www2.example.com hostname
ssh root@www3.example.com hostname
ssh root@www4.example.com hostname
Другие вопросы по тегам