Realice la sustitución en un subshell en lugar del shell actual.
PATH=abc:$PATH sh -c 'echo $PATH'
Вы можете обернуть это в рекурсивную функцию:
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
Если вы можете позволить себе ввести столько запятых, сколько вам нужно 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