コマンドラインから入力を受け取る関数があります。オプションで、標準入力から。ただし、入力ストリームが指定されていない場合は入力を停止します。
#!/bin/bash
somefunc() {
# output strings on command line.
while (($#)); do
echo "$1"
shift
done
# take input from stdin, if it exists.
declare line
while read -sr line; do
echo "$line"
done
}
somefunc "$@"
これは働きます:
$ somefunc "arg1" "arg2" "..." <"/some/file"
以下は行われません。
$ somefunc "arg1" "arg2" "..."
読み取りコマンドにタイムアウト(例:-t 0.0001)を使用してこの問題を解決できますが、これは少しぎこちなく脆弱です。
タイムアウトを使用せずにこれを達成するより良い方法はありますか?
答え1
-t を使用した bash 組み込みテストでは、作業をうまく実行する必要があります。 [ -t 0 ]
このリンクには良い例があります。
答え2
2つの解決策があり、どちらも同じように速くて不器用です。
これが私が好む解決策です。
# take input from stdin, if it exists.
if read -t 0; then
declare line
while read -sr line; do
echo "$line"
done
fi
[ -t 0 ] も動作します:
# take input from stdin, if it exists.
if [ -t 0 ]; then
declare line
while read -sr line; do
echo "$line"
done
fi
答え3
< /dev/null
おそらく、保留中のコマンドの最後に追加した場合でしょう。
これは、標準入力を中断することなくコマンドを続行できるように、コマンドへの仮想入力を提供します。