これを実行したときに期待した結果が得られましたbash
。
[ "a" == "a" ] && echo yes
それは私に与えられましたyes
。
ただし、でこれを行うと、zsh
次の結果が表示されます。
zsh: = not found
同じコマンド(/usr/bin/[
)が異なるシェルで異なる動作をするのはなぜですか?
答え1
/usr/bin/[
それはどんな殻にもありません。 Bashでは次のように使用します。組み込みtest
/[
コマンドと同様に、zshでも。
違いは次のとおりです。=
zshには拡張機能もあります:=foo
実行可能ファイルのパスを展開しますfoo
。これは意味する==
=
コマンドから呼び出されたコマンドを見つけようとして処理されます。PATH
。コマンドが存在しないため、エラーが発生します。
zsh: = not found
ご存知のように(実際に実際に使用しても同じことが起こります/usr/bin/[
)。
あなたできる==
本当に必要な方はこちらをご利用ください。これはzshで期待どおりに機能します。
[ "a" "==" "a" ] && echo yes
参照によって=word
拡張機能が実行されないためです。を使用してこのequals
オプションを無効にすることもできますsetopt noequals
。
ただし、次のようにすることをお勧めします。
- 使用順序
=
、POSIX準拠の平等テスト;または - もっと良いことは、
[[
条件文を次のように使用してください。==
同時に吹くそして扱いにくい。一般に、[[
これらの問題(およびその他の問題)を回避するには、内部的に特殊な解析規則を含める方が良いと安全です。
答え2
[
Bashとzshに組み込まれたシェルコマンドです。
$ type [
[ is a shell builtin
~からシェル組み込みコマンド文書:
組み込みコマンドは次のとおりです。シェル自体に含まれる。組み込みコマンドの名前が単純なコマンドの最初の単語として使用される場合(参照:簡単なコマンド)、シェルは他のプログラムを呼び出さずに直接コマンドを実行します。別のユーティリティを使用して取得できない機能や便利でない機能を実装するには、組み込みコマンドが必要です。
公式文書($ help test
)では、次の項目のみを使用できます=
。
文字列1 = 文字列2
文字列が等しい場合は真です。
したがって、正しい表現は次のようになります。
$ [ "a" = "a" ] && echo yes
yes
何が起こるかは、bashがあまり厳しくないということです。サポート==
キャリア[
bash拡張のようです。そしてその使用はお勧めできません:
文字列1 ==文字列2
文字列1 = 文字列2
文字列が等しい場合は真です。 [[コマンドと一緒に使用すると、上記のようにパターンマッチングが実行されます(参照:条件付き構造)。
POSIX 準拠を保証するには、テストコマンドで '=' を使用する必要があります。
を使用するには、次のキーワードを使用する必要が==
あります[[
。
$ [[ "a" == "a" ]] && echo yes
yes
[[
移植性が低下することに注意してください(POSIXではありません)。ただし、bashとzshはどちらもサポートしています。
答え3
zshとbashは同じ答えを提供します(type
両方のシェルが組み込まれています)。
$ type -a [
[ is a shell builtin
[ is /usr/bin/[
答え4
両方のシェルでは、bash
このzsh
ユーティリティ[
はシェルに組み込まれています。これはツールのシェル実装で、バイナリよりも優先順位が高くなります/usr/bin/[
。経験する他の結果は、異なる実装によって引き起こされます。
では、ユーティリティbash
は[
複合CONDITIONAL EXPRESSIONS
コマンドを受け入れます[[
。 bashsのマニュアルページに従って=
および両方==
利用できます。
string1 == string2
string1 = string2
True if the strings are equal. = should be used with the test command for POSIX
conformance.
zsh
この[
ユーティリティはPOSIXとその拡張機能を実装しようとします。内部にPOSIXテストユーティリティの仕様定義された演算子はありません==
。