`env foo = bar echo $ foo`は何も出力しません


8

私は巨大なブレインファートを持っていると思います。私は期待します

env foo=bar echo $foo

...印刷しますがbar、代わりに空の行が表示されます。ワット。

bash構文を使用した場合も同じことが起こります。

foo=bar echo $foo

回答:


8

同様の質問が最近回答されました。シンボルはこの行で定義される前にその行で評価されるため、定義を分割してシンボルを使用して行を分ける必要があります。

コメントを求められたら、次のようにすることができます。

foo=bar bash -c 'echo $foo'

これは、最初に値を割り当て、fooそれを印刷できる環境変数として新しいプロセスに渡します。

詳細については、POSIXシェルコマンド言語トークンの認識をご覧ください。

@mikeservコメントからのフォローアップ:

  • POSIXは、全体の答えを提供するのに十分明確ではありません。
  • 引用されたセクションの冒頭には、

    シェルは、ファイルから、対話型シェルの場合は端末から、またはsh -cまたはsystem()の場合は文字列から、行単位で入力を読み取ります。

  • 最後に、それは言います

    トークンが区切られると、それはシェル文法の文法で必要とされるように分類されます。

  • しかし、POSIXは、文法に取り組む前に行全体がトークン化されることを明示的に述べていません。
  • その場合、私たちは既存の慣行に依存しています-書かれた標準に矛盾するものは何もないためシェルは適合しますが、標準はすべての場合の動作を予測するために使用できるわけではありません。
  • もちろん、同じコメントがエイリアスの動作にも適用されます(そのため、私はそれを同様の質問と呼びました)。

または、地獄を引用しても大丈夫ならenv foo=bar bash -c 'echo $foo'
badp

実際には、エイリアスの質問は、トークンが文法に進む前に特定の行に対してすべて計算されるというトークン認識セクションの含意に依存しています。ただし、どちらの場合も、標準は明示的ではないため、既存のプラクティスに依存します。
Thomas Dickey、

@thomasdickey-ええ、それも私の趣旨でした。あなたがコメントを書いているとき、あなたが@username...comment指定したユーザーを実行すると、あなたが彼らと話していることを知らせる小さなメッセージが表示されます。まあ、彼らはそのスレッドに関連している場合。
mikeserv 2015年

@mikeserv(このように)。うーん-私はそれを覚えておきます(埋め込まれたブランクでどのように機能するかは明らかではありませんでした)。
Thomas Dickey、

そのように。接線方向に、私は見ていたluit.cと私は考えて私だけ変更することができますsetup_io(){ ... ;fnctl(0, [GS]ETFL, 0);...}行うには2最初の引数に。まあ、私はcopyTermios()setRawTermios()関数にも少し変更が必要かもしれませんが、それは簡単なはずです。rc = (return)ライン毎に奇妙に思える-しかし、私はどちらか全くCプログラマだありません。それはあなたのものですか、それとも受け継がれましたか?空白のコメントがあなたを参照し"${set_null_var:=new val and $(echo other stuff)}"ている場合、ほとんど何でもwで安全です。いくつかのシェルはで奇妙なことをし}ます。
mikeserv 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.