[ -t /tmp -o -f /tmp ]が「あまりにも多くの引数」を投げるのはなぜですか?

[ -t /tmp -o -f /tmp ]が「あまりにも多くの引数」を投げるのはなぜですか?

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設定されていないため、$tmp0として処理され、結果として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

関連情報