Bashの対話型検出について質問があります。
次のスクリプトは、対話型モードで呼び出されるかどうかに関係なく印刷されます。
$ cat int.sh
#!/bin/bash
if [ -t 0 ]; then
echo "interactive"
else
echo "not interactive"
fi
通貨のいくつかの例...
$ ./int.sh
interactive
$ echo toto | ./int.sh
not interactive
$ ./int.sh < ./int.sh
not interactive
$ ./int.sh <<EOF
> hello world!
> EOF
not interactive
しかし、次のケースの結果がインタラクティブなのはなぜですか?
$ ./int.sh <( cat ./int.sh )
interactive
答え1
Bashの声明は次<(...)
のとおりです。プロセスの交換。プロセスが<(...)
実行されると、対応する入力または出力がFIFOまたはファイルに接続されます/dev/fd
。確認してください:
echo <(echo foo)
それはそのようなものを印刷します/dev/fd/63
。これがファイル記述子です。その後、その<(...)
部分は対応するファイル記述子に置き換えられます。したがって、宣言では、呼び出しは次のようになります。
./int.sh <( cat ./int.sh )
次に交換:
./int.sh /dev/fd/63
したがって、これはスクリプトのパラメータにすぎず、./int.sh
依然として対話的に呼び出されます。