Как передать конвейерный ввод второй команде в псевдониме?

Как передать конвейерный ввод второй команде в псевдониме?

Я определил псевдоним следующим образом:

alias xyz='command1; command2'

Я хочу передать вывод другой команды pqr в command2 следующим образом:

pqr | xyz -f -

Возможно ли это? Как мне этого добиться?

решение1

Использование псевдонима обычнонетхорошая практика в неинтерактивных сценариях оболочки (БашFAQ/080). При таком способе определения псевдонима в вашем OP только первые команды считываются из стандартного ввода, поскольку это ;прекращает выход вашего стандартного ввода за пределы вашей первой команды.

Один из возможных способов — сделать группировку команд с помощью {..}, так что любые перенаправления будут применяться ко всему набору команд внутри группы. Вы по-прежнему можете сохранить свое aliasопределение и сделать

alias xyz='{ command1; command2; }'

В этом случае вы comamnd1без необходимости получаете копию стандартного ввода. Вы можете закрыть его, выполнив

alias xyz='{ command1 < /dev/null ; command2 - ; }'

Или используйте функции для определения своих команд.

xyz() {
    command1; command2
}

Если ваша оболочка bashподдерживает zshподстановку процессов, вы можете просто определить, command2чтобы получать содержимое stdin как позиционные аргументы. Переопределите вашу функцию как

xyz() {
    command1
    command2 "$@"
}

и затем вызовите вашу команду ( pqr) как

xyz < <(pqr)

Простая демонстрация вышесказанного,

zoo() { date; sed 's/foo/boo/' "$@"; }
zoo < <(echo food)                     #(or) zoo <<<"food"
Mon Nov 25 02:44:49 EST 2019
bood

решение2

Я предлагаю вам попробовать подход xargs, а именно:

alias xyz='command1; command2 | xargs pqr'

Это эквивалентно запуску pqrс command2входным аргументом

решение3

Чтобы передать что-либо в стандартный ввод command2из списка команд

command1; command2

вам нужно убедиться, что это command1не считывается из стандартного ввода. Это можно сделать, перенаправив стандартный ввод из /dev/nullв command1:

command1 </dev/null; command2

Это оставляет вас с псевдонимом

alias xyz='command1 </dev/null; command2`

что вы бынетиметь возможность звонить с

pqr | xyz -f -

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

pqr | command1 </dev/null; command2 -f -

что то же самое, что и

pqr | command1 </dev/null
command2 -f -

Вместо этого определите xyzкак функцию оболочки:

xyz () {
    command1 </dev/null
    command2 "$@"
}

Здесь command2будут получены как стандартный ввод функции, так и любые аргументы командной строки, переданные функции.

Теперь вы сможете использовать это в конвейере pqr | xyz -f -.

Если (и только если) -f -аргументы, которые вы передаете, command2говорят «читать из стандартного ввода» (с -обозначением стандартного ввода), то вы можете вместо этого -передать подстановку процесса в xyz, если ваша оболочка поддерживает это:

xyz -f <(pqr)

С помощью вышеуказанной функции это будет то же самое, что сделать

command1 </dev/null
command2 -f <(pqr)

Связанный контент