shell
  • whitespace
  • 2017-03-11 6 views 3 likes 
    3
    $ freebsd-version 
    10.3-RELEASE-p17 
    $ 
    
    portinstall() { 
        port="$1"; shift 
        env="[email protected]" 
    
        #1 
        env "[email protected]" printenv | grep -E '^WITH(OUT)?=' 
        #2 
        env "$env" printenv | grep -E '^WITH(OUT)?=' 
        #3 
        env "$*" printenv | grep -E '^WITH(OUT)?=' 
        #4 
        env [email protected] printenv | grep -E '^WITH(OUT)?=' 
        #5 
        env $* printenv | grep -E '^WITH(OUT)?=' 
    
    } 
    
    
    portinstall foo/bar WITH='baz xyzzy' WITHOUT='quux' 
    

    のみ#1作品、その出力#2とBourneシェル空白複雑

    WITHOUT=quux 
    WITH=baz xyzzy 
    

    、#3(WITHは、単に1つの変数 "= quux WITHOUTバズのXYZZY" である):

    WITH=baz xyzzy WITHOUT=quux 
    
    #4で

    、#5

    env: xyzzy: No such file or directory 
    

    私の主な質問は、なぜ#1作品ですが、一見同等の#2はありませんか?

    +0

    'env $ @ printenv'の問題は二重引用符が不足しています。' env'は複数の引数(複数)で動作しますので、誤りです。二重引用符で修正する必要があります! – Inian

    +0

    @Inian、yup、#4-5はかなり自明ですが、私は完全性のためにそれらを列挙しました。私の混乱は#1-2とある。 – Rihad

    答えて

    2

    "[email protected]"を使用するのが最も適切な場合がありますが、この分析は理由を理解するのに役立ちます。

    あなたのコードは、およそ次のとおりです。

    env="[email protected]" 
    
    #1 
    env "[email protected]" printenv | grep -E '^WITH(OUT)?=' 
    #2 
    env "$env" printenv | grep -E '^WITH(OUT)?=' 
    #3 
    env "$*" printenv | grep -E '^WITH(OUT)?=' 
    #4 
    env [email protected] printenv | grep -E '^WITH(OUT)?=' 
    #5 
    env $* printenv | grep -E '^WITH(OUT)?=' 
    

    、あなたが引数WITH='baz xyzzy' WITHOUT='quux'でスクリプトを実行しています。はい、あなたは複雑さに加えて、機能と余分な引数を$1として追加しましたが、それらはほとんど無関係です。これがコアです。

    一般に、$*は、引数で区切られた単語にスペースで区切られています。 [email protected]も同じです。 "[email protected]"は、内部スペースを保持する引数のセットに展開し、"$*"は、内部スペースを保持し、引数の間に単一のスペースを持つ単一の文字列にマップします。

    しかし、env="[email protected]"のコンテキストでは、割り当てはenv="$*"のように振る舞います。変数には1つの文字列があります。別の引数を保持するために、バッシュでは、あなたは、配列を使用したい:

    env=("[email protected]") 
    

    を、あなたが使用してそれらを印刷できます。

    printf '%s\n' "${env[@]}" 
    

    は、しかし、それは接線で降ります。

    #1の場合は、有効なスペースを保持する2つの割り当てでenvの呼び出しを終了します。printenvが正しく出力され、grepがフィルタリングされ、2つの変数値が与えられます。これは、通常"[email protected]"が正しい理由です。

    は、#2、#3を使用すると、あなたがいることがわかり理由は、それが変数WITHに割り当て、残りの文字列がbaz xyzzy WITHOUT=quuxあるので(WITH=を開始し、単一の文字列、とenvの呼び出しで終わります。。WITH - - 出力は、単一の環境変数がありますとしてではなく、その値はスペースと割り当てが含まれている#4、#5で

    、あなたが実行しました:

    env WITH=baz xyzzy WITHOUT=quux printenv 
    

    xyzzyが割り当てではありませんので、 、それはコマンドで呼び出され、 rguments WITHOUT=quuxprintenv(環境にはWITH=bazが追加されていますが)xyzzyというプログラムがないので、envにエラーが表示されます。あなたは何が起こっているかを示すためにxyzzyプログラムを作成することができます。

    配列envでは、あなたが実行できます。

    env "${env[@]}" printenv | … 
    

    を、あなたは#1と同じ結果を得ると思います。

    +0

    お読みください:http://unix.stackexchange.com/questions/41571/what-is-the-difference-between-and – codeforester

    +0

    非常に詳細な説明をありがとうございます! – Rihad

    関連する問題