
次のようなエイリアスを定義しました:
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
。関数を次のように再定義します。
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)