
В документации xargs
есть упоминание о "replstr", который -I
принимает флаг. Я начал читать об этом, когда нашел эту команду для запуска fswatch
:
fswatch -0 -e ".*" -i ".rb" . | xargs -0 -n 1 -I {} ruby {}
и начал читать страницу руководстваxargs
-I replstr
Execute utility for each input line, replacing one or more occurrences of replstr in up to replacements (or 5 if no -R flag is
specified) arguments to utility with the entire line of input. The resulting arguments, after replacement is done, will not be
allowed to grow beyond 255 bytes; this is implemented by concatenating as much of the argument containing replstr as possible, to
the constructed arguments to utility, up to 255 bytes. The 255 byte limit does not apply to arguments to utility which do not
contain replstr, and furthermore, no replacement will be done on utility itself. Implies -x.
Если подумать о термине "replstr", то, похоже, он означает что-то вроде "read evaluation print loop string", это сокращение от этого? Я начал экспериментировать с ним, чтобы попытаться получить представление о том, что он {}
делает, но я не уверен, что я действительно понял это:
➜ scripts git:(master) ✗ {0..3}
zsh: command not found: 0..3
➜ scripts git:(master) ✗ echo {0..3}
0 1 2 3
➜ scripts git:(master) ✗ echo {a..3}
a ` _ ^ ] \ [ Z Y X W V U T S R Q P O N M L K J I H G F E D C B A @ ? > = < ; : 9 8 7 6 5 4 3
➜ scripts git:(master) ✗ echo {a..d}
a b c d
➜ scripts git:(master) ✗ echo cats and dogs | xargs
cats and dogs
➜ scripts git:(master) ✗ echo cats and dogs | xargs {}
xargs: {}: No such file or directory
➜ scripts git:(master) ✗ echo cats and dogs | xargs {} echo {}
xargs: {}: No such file or directory
➜ scripts git:(master) ✗ echo cats and dogs | xargs -I {}
➜ scripts git:(master) ✗ echo cats and dogs | xargs -I {} echo {}
cats and dogs
Например echo {a..3}
, для меня это действительно не имеет смысла. Определенно кажется, что это делает что-то вроде "подставить этот список строк сюда", но я не уверен, что это правильный способ смотреть на это. Также я не уверен, является ли {}
это определенным типом replstr и есть ли еще или replstr - это просто что-то между парой фигурных скобок. Хотелось бы получить какие-нибудь рекомендации по replstr и как к ним подходить.
решение1
replstr
означает «заменяющая строка» или «заменяющая строка».
Оригинальная replstr — {}
. Впервые она была введена в предложении find
команды exec
, где она заменялась каждым найденным именем файла, например
find /tmp -name "foo*" -exec echo file {} found \;
отобразится, если два файла соответствуют шаблону:
file foo1 found
file foo2 found
Команда xargs
позволяет делать то же самое с аргументами, созданными из строк, переданных на ее стандартный ввод, а также позволяет указать {}
в качестве заменяющей строки что-то иное.
Обратите внимание, что replstr по умолчанию — это просто {}
пустое место внутри фигурных скобок, которые используются для разных целей, например, для диапазонов, как вы уже заметили, или для расширения параметров.
решение2
Аргумент -I
работает следующим образом: -I whatever
означает, что вхождения буквально whatever
заменяются аргументом команды. Демонстрация:
$ echo "a
b
c" | xargs -I f echo hey f hey f
hey a hey a
hey b hey b
hey c hey c
Видите? xargs
взял каждую из строк a
, b
, и c
, и подставил их вместо f
в echo hey f hey f
.
Нет никакого {}
участия.
Параметр -I
— POSIX. GNU xargs
документирует устаревший -i
параметр, который при вызове как -iwhatever
ведет себя как -I whatever
. При вызове как просто -i
он ведет себя как -I {}
. В этом случае вхождения {}
заменяются. {}
явно вдохновлен особенностью find
: его -exec
предикатом.
Синтаксис {a..b}
Bash foo{a,b,c}bar
, обработанный его «расширением фигурных скобок», {}
не имеет специального значения и передается команде как есть. (Если бы это было не так, это нарушило бы соответствующие стандарту, часто встречающиеся find
вызовы.)
решение3
Это {...}
естьрасширение скобы оболочки, который поддерживает списки, такие как {a,b,c}
(расширяется до a
, b
и c
), и последовательности чисел, такие как {0..13}
(расширяется до чисел 0
, 1
... 12
, 13
) или символов {a..d}
( a
, b
, c
, d
). (Расширение фигурных скобок не имеет ничего общего с {}
заполнителем, используемым xargs
).
Несколько странная последовательность, которая {a..3}
расширяется до, объясняется тем, чтоТаблица символов ASCII. Так как a
не является числом, оба воспринимаются как символы, а расширение — это все символы между a
и 3
по числовому значению кодов символов. Так как это происходит, a
идет после 3
, поэтому последовательность идет вниз через заглавные буквы и цифры от 9 до 3.
Как видно, смешивание букв и цифр в таком диапазоне не очень полезно, но {a..z}
может {A..Z}
быть полезным, как и аналогичные операторы [a-z]
и [A-Z]
в регулярных выражениях и подстановках оболочки. (Если, конечно, вы можете игнорировать остальные буквы.)