私のもの回答StackOverflowは少なくとも2つの賛成票を受け取り、以前の職場で使用されていたワークステーションシェルで実行されました。そのワークステーションには、SunOS、Red Hat Commercial Linux、またはRed Hat Enterprise Linuxの以前のバージョンがあります。[[ -fwd
path
]]
テストしてみてくださいpath
通常のファイルと書き込み可能なディレクトリに。sh
、、、、bash
およびcsh
は、このワークステーションにインストールできる唯一のシェルで、おそらく実行されtcsh
ます。zsh
bash
現在、他のUnix系オペレーティングシステムではこの問題を再現できないため、この質問をさせていただきます。それはいつも私に文法エラーだから、正常に実行したのか疑問になり始めました。
私の質問は、このコードがどのシステムで動作するのか、それでこれがバグですか、それとも機能ですか?
答え1
いいえ、動作しません。すべてのbashバージョンでは使用できません。
このテストはすべてのbashバージョン(実際にはすべてのシェル)で動作します。
$ [ -fwd ] && echo "It worked" || echo "not"
It worked
ただし、ファイルフラグをテストせずに-fwd
文字列の長さがゼロであることをテストします。いくつかの特性があるため、テストは正確です。
[[
変更許可フラグを使用してください。
$ [[ -fwd ]] && echo "It worked" || echo "not"
b204sh : /home/user/so: line 3: unexpected argument to conditional unary operator
上記のエラーはbash 3.2でbashとして発生します。
3.2以降のbashバージョンにはバグはありませんが、結果はtrueです。
$ [[ -fwd ]] && echo "It worked" || echo "not"
It worked
これは不可能です。ディレクトリエントリはファイル(-f
)であり、ディレクトリ(-d
)にすることはできません。
これは、テストが実際に文字列をテストしているという考えを確認します。
$ [[ \-fwd ]] && echo "It worked" || echo "not"
It worked
ファイルでテスト
$ touch wds
$ [[ -fwd wds ]] && echo "It worked" || echo "not"
bash: conditional binary operator expected
bash: syntax error near `wds'
3.2以降のbashバージョンでは、失敗メッセージが表示されます。
他のバージョンでは実際の答えを提供します(ファイルテストでは不可能であり、ディレクトリエントリはファイルでありながらディレクトリにはできません)。
これら2つのテストを比較すると、最初の文字だけが使用されたようです。
$ b204sh -c '[[ -fd wds ]] && echo "It worked" || echo "not"'
It worked
$ b204sh -c '[[ -df wds ]] && echo "It worked" || echo "not"'
not
それはおそらくbash 4で修正されたバグでしょう。
また、次のような場合でも失敗します。
掘削 [[: No match.
tcsh [[: Command not found.
扱いにくい unknown condition: -fd
#バージョン5.4.2
ケシ syntax error at line 3:
wds '予期しない`#バージョンAJM 93u + 2012-08-01