`[`がシェル組み込み関数で、`[[`がシェルキーワードであるのはなぜですか?

`[`がシェル組み込み関数で、`[[`がシェルキーワードであるのはなぜですか?

私の知る限りでは[[そうです。強化されたバージョン[なのに、[[キーワードで見て内蔵に出てくると[混乱しますね。

[root@server ~]# type [
[ is a shell builtin
[root@server ~]# type [[
[[ is a shell keyword

TLDP説明する

組み込みコマンドは同じ名前のシステムコマンドと同義語ですが、Bashはそれを内部的に再実装します。たとえば、Bash echoコマンドは/ bin / echoとは異なりますが、動作はほぼ同じです。

そして

キーワードは予約語、タグ、または演算子です。キーワードはシェルに特別な意味を持ち、実際にはシェル構文のコンポーネントです。たとえば、for、while、do、および!がキーワードです。組み込み関数と同様に、キーワードは Bash にハードコードされていますが、組み込み関数とは異なり、キーワードはコマンド自体ではなく、コマンド構成のサブユニットです。 [2]

[これはmakeと[[キーワードにする必要はありませんか?ここで何か抜けましたか?返品、このリンクもう一度確認すると、[同じ[[カテゴリに属しているはずです。

ベストアンサー1

[との違いは[[非常に基本的です。

  • [命令だ。その引数は他のコマンド引数と同じように扱われます。たとえば、次のことを考えてみましょう。

    [ -z $name ]
    

    シェルが拡張されて$name実行されます。両方結果は他のコマンドと同様にトークン化され、ファイル名が生成されます。

    たとえば、次の操作は失敗します。

    $ name="here and there"
    $ [ -n $name ] && echo not empty
    bash: [: too many arguments
    

    これが正しく機能するには引用符が必要です。

    $ [ -n "$name" ] && echo not empty
    not empty
    
  • [[特別な規則に従って引数が処理されるシェルキーワード。たとえば、次のことを考えてみましょう。

    [[ -z $name ]]
    

    シェルは拡張されますが、$name他のコマンドとは異なり実行されます。どちらもありません結果に対して単語分割またはファイル名生成を実行します。たとえば、以下はスペースが含まれていても成功しますname

    $ name="here and there"
    $ [[ -n $name ]] && echo not empty
    not empty
    

一般化する

[シェルで実行される他のすべてのコマンドと同じ規則に従うコマンド。

しかし、[[それはコマンドではなくキーワードなので、シェルで特に扱われ、非常に異なる規則に従って動作します。

おすすめ記事