フラグを組み合わせて複数のファイル条件をテストします。動作しますか?

フラグを組み合わせて複数のファイル条件をテストします。動作しますか?

私のもの回答StackOverflowは少なくとも2つの賛成票を受け取り、以前の職場で使用されていたワークステーションシェルで実行されました。そのワークステーションには、SunOS、Red Hat Commercial Linux、またはRed Hat Enterprise Linuxの以前のバージョンがあります。[[ -fwdpath]]テストしてみてくださいpath通常のファイルと書き込み可能なディレクトリに。sh、、、、bashおよびcshは、このワークステーションにインストールできる唯一のシェルで、おそらく実行されtcshます。zshbash

現在、他の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.
[[: Command not found.
unknown condition: -fd#バージョン5.4.2
syntax error at line 3:wds '予期しない`#バージョンAJM 93u + 2012-08-01

おすすめ記事