Параметризация связанных вызовов служебной программы в Bash

Realice la sustitución en un subshell en lugar del shell actual.

PATH=abc:$PATH sh -c 'echo $PATH'
12
19.06.2019, 14:12
2 ответа

Вы можете обернуть это в рекурсивную функцию:

smooth() {
  if [[ $1 -gt 1 ]]; then # add another call to function
    command smooth | smooth $(($1 - 1)) 
  else
    command smooth # no further 
  fi
}

Вы можете использовать это как

generate | smooth 5 | plot

что было бы эквивалентно

generate | smooth | smooth | smooth | smooth | smooth | plot
18
27.01.2020, 19:55

Если вы можете позволить себе ввести столько запятых, сколько вам нужно smoothкоманд, вы можете воспользоваться расширением скобок оболочки, разделенным запятыми -.

л.с.; ДР

Вся строка команды -для вашего примера будет:

generate | eval 'smooth |'{,,,,} plot

Примечание:

  • добавьте или удалите запятые, если вы хотите больше или меньше повторенийsmooth |
  • нет |перед plot, потому что это включено в последнюю строку smooth |, созданную расширением фигурной скобки
  • вы также можете предоставить аргументы для smooth, если вы можете правильно включить их в фиксированную часть в кавычках, которая предшествует открывающей фигурной скобке; в любом случае помните, что вы будете предоставлять их всем повторениям команды

Как это работает

Запятая -, разделенная скобками. Расширение позволяет динамически создавать строки, каждая из которых состоит из указанной фиксированной части плюс указанные переменные части. Он производит столько строк, сколько указано переменных частей, например a{b,c,d}производит ab ac ad.

Небольшая хитрость здесь заключается в том, что если вы скорее создадите список из пустых переменных частей, то есть только с запятыми внутри фигурных скобок, расширение скобок просто создаст копии только фиксированной части. Например:

smooth{,,,,}

произведет:

smooth smooth smooth smooth smooth

Обратите внимание, что 4 запятых дают 5 smoothстрок. Именно так работает это раскрытие фигурных скобок :: оно создает строки, содержащие столько запятых плюс одна.

Конечно, в вашем случае вам также нужен |, разделяющий каждый smooth, поэтому просто добавьте его в фиксированную часть, но позаботьтесь о правильном цитировании, чтобы оболочка , а не интерпретировала его в однажды. То есть:

'smooth|'{,,,,}

будет производить:

'smooth|' 'smooth|' 'smooth|' 'smooth|' 'smooth|'

Следите за тем, чтобы фиксированная часть всегда располагалась непосредственно рядом с открывающей фигурной скобкой, то есть между ' и {не должно быть пробелов.

(Также обратите внимание, что для формирования фиксированной части вы также можете использовать двойные -кавычки вместо одинарных -, если вам нужно расширить переменные оболочки в фиксированной части. Просто позаботьтесь о дополнительном экранировании, которое требуется, когда некоторые специальные символы оболочки встречаются внутри строки -в двойных кавычках ).

На этом этапе вам нужно применить eval к этой строке, чтобы оболочка, наконец, интерпретировала ее как конвейерную команду, которой она должна быть.

Таким образом, подводя итог, вся командная строка -для вашего примера случая будет:

generate | eval 'smooth |'{,,,,} plot
5
27.01.2020, 19:55

Теги

Похожие вопросы