
Я определил псевдоним следующим образом:
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)