Что такое replstrs как {}?

В документации для xargs упоминается «replstr», который принимает флаг -I . Я начал читать об этом, когда нашел эту команду для запуска fswatch :

 fswatch -0 -e ".*" -i ".rb" . | xargs -0 -n 1 -I {} ruby {} 

и начал читать man- xargs для 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 оценить строку цикла печати», это то, для чего это не так? Я начал играть с ним, чтобы попытаться понять, что делает {} , но я не уверен, что я действительно понял это:

 ➜ 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 ` _ ^ ] \ [ ZYXWVUTSRQPONMLKJIHGF EDCBA @ ? > = < ; : 9 8 7 6 5 4 3 ➜ scripts git:(master) ✗ echo {a..d} abcd ➜ 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} действительно не имеет смысла для меня. Кажется, что это что-то делает, чтобы «заменить этот список строк здесь», но я не уверен, что это правильный способ взглянуть на него. Также я не уверен, что {} – specfic тип replstr, и если есть больше, или если replstr – это всего лишь что-то между двумя фигурными фигурными скобками. Хотелось бы узнать некоторые рекомендации по поводу того, как они работают.

3 Solutions collect form web for “Что такое replstrs как {}?”

Аргумент -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} и foo{a,b,c}bar обработанный его «расширением брекета». {} не имеет специального значения и передается команде as-is. (Если бы это было не так, это нарушило бы стандартно-совместимые, обычно встречающиеся find .)

replstr означает «строка замены» или «заменить строку».

Исходный replstr – {} . Он был впервые представлен с предложением команды exec find , где он заменяется каждым найденным именем файла, например

 find /tmp -name "foo*" -exec echo file {} found \; 

будет отображаться, предполагая, что два файла соответствуют шаблону:

 file foo1 found file foo2 found 

Команда xargs позволяет сделать то же самое с аргументами, построенными из строк, переданных на стандартный вход, а также позволяет указать что-то другое, чем {} качестве строки замены.

Обратите внимание, что по умолчанию replstr просто {} не содержит ничего внутри фигурных скобок, последний используется для разных целей, например диапазонов, как вы уже заметили, или расширения параметра.

{...} – расширение скобки оболочки , которое поддерживает такие списки, как {a,b,c} (расширяется до a , b и c ), а последовательности чисел, такие как {0..13} (расширяются до чисел 0 , 112 , 13 ) или символы {a..d} ( a , b , c , d ). (Расширение xargs не имеет ничего общего с {} заполнителем, используемым xargs ).

Несколько нечетная последовательность, которая {a..3} расширяется до, объясняется таблицей символов ASCII . Поскольку a не является числом, оба принимаются как символы, а расширение – это все символы между a и 3 по числовому значению кодовых символов. Как это бывает, a приходит после 3 , поэтому последовательность выполняется вниз через прописные буквы и цифры от 9 до 3.

Как видно, смешивание букв и цифр в таком диапазоне не очень полезно, но {a..z} или {A..Z} может быть, а также аналогичные [az] и [AZ] в регулярных выражениях и shell globs. (То есть, если вы можете игнорировать остальные буквы.)

  • cmd2 `cmd1` vs cmd1 | xargs cmd2
  • В чем разница между результатами и эффективностью после добавления -f в rm и -print в поиске?
  • Есть ли способ использовать xargs через трубу?
  • Передача параметров mulitiple через xargs
  • basename не работает должным образом
  • Как подключить вывод netcat? Проблемы с xargs и кавычками
  • Как мне регистрировать xargs -0 rm?
  • Объединить аргумент xargs с некоторым текстом
  • Невозможно запросить пользователя с помощью опции rm bultin prompt -i с помощью xargs и найти
  • цикл xargs с переменной ввода для использования в команде с несколькими командами
  • xargs не работает в Linux, поскольку работает в Unix
  • Linux и Unix - лучшая ОС в мире.