Bash セッション内で次のコマンドを正常に実行できます。
[ -e /tmp -o -f /tmp ]
ただし、次のコマンドはエラーメッセージで失敗します。[: 引数が多すぎます。:
[ -t /tmp -o -f /tmp ]
-e
コマンドと置換の両方が-t
単項演算子であり、式全体の構文を変更していないため、2番目のコマンドが失敗する理由を説明できません。
答え1
演算子は単項演算子であり、bashでは数字が必要ですが-t
(kshまたはzshの算術式ではありません)、これが受け取られるエラーを説明しません。
理由を説明せず、偽を誤って返すこともあり[ -t /tmp ]
ません[ X -a -t -a Y ]
。
test
/buildinコードを見ると、次のようなものが[
あることがわかります。そこに残ったものそれ以降は削除されず、POSIXアルゴリズムに準拠するようにコードが更新されました[ -t ]
。[ -t 1 ]
バラよりこのバグレポートもっと学ぶ。
また、バイナリ-a
/-o
演算子は次のようになります。いいえ使用。 POSIXでは、何十年も使用されておらず、結果として信頼できないテスト式が生成されました。
使用:
[ -d /tmp ] || [ -f /tmp ]
代わりに。
、so、または-f
を暗示することはあまり意味がなく、(シンボリックリンクの確認後)存在するかどうかを確認するためのテストで書くことができます。-e
[ -e /tmp -o -f /tmp ]
[ -e /tmp ] || [ -f /tmp ]
[ -e /tmp ]
/tmp
定期的なファイル(-f
)またはファイルではありません。
存在するzsh
:
$ zsh -c '[ -t /tmp ]'
zsh:1: bad math expression: operand expected at `/tmp'
/tmp
本当に一つ誤った数学表現、これ予想されるオペランド演算子/
ではなく除算数学演算子を表します。-t
[
$ zsh -c '[ -t foo/tmp ]'
zsh:1: division by zero
今回は有効な式(foo
変数除算変数)ですがtmp
設定されていないため、$tmp
0として処理され、結果として0で除算されます。
$ zsh -o nounset -c '[ -t foo/tmp ]'
zsh:1: tmp: parameter not set
このnounset
オプションは、初期化されていない変数を検索するのに役立ちます。
$ foo=4 tmp=2 zsh -o nounset -c '[ -t foo/tmp ] &&
printf "fd %d is open on a tty device\n" foo/tmp'
fd 2 is open on a tty device