`env foo = bilah gema $ foo` tidak mencetak apa pun

8

Saya pikir saya memiliki pemikiran besar. Saya harapkan

env foo=bar echo $foo

... untuk mencetak bar, tapi saya malah mendapat baris kosong. Wat.

Hal yang sama terjadi jika saya menggunakan sintaks bash:

foo=bar echo $foo
badp
sumber

Jawaban:

8

Pertanyaan serupa dijawab baru-baru ini : simbol dievaluasi dalam baris sebelum simbol didefinisikan dalam baris ini, sehingga perlu untuk membagi definisi dan penggunaan simbol untuk memisahkan garis.

Diminta oleh komentar, Anda bisa melakukan ini:

foo=bar bash -c 'echo $foo'

yang pertama kali menetapkan nilai ke foodan meneruskannya ke proses baru sebagai variabel lingkungan di mana ia dapat dicetak.

Anda dapat membaca lebih lanjut tentang hal itu di POSIX Shell Command Language Token recognition .

Tindak lanjut dari komentar @mikeserv :

  • POSIX tidak cukup eksplisit untuk memberikan seluruh jawaban.
  • Di awal bagian yang dikutip, katanya

    Shell harus membaca inputnya dalam bentuk baris dari file, dari terminal dalam kasus shell interaktif, atau dari string dalam kasus sh -c atau sistem ().

  • pada akhirnya, katanya

    Setelah token dibatasi, itu dikategorikan sebagai diperlukan oleh tata bahasa di Shell Grammar.

  • tetapi POSIX tidak mengatakan secara eksplisit bahwa seluruh baris tokenized sebelum mengerjakan tata bahasa.
  • dalam hal ini, kami mengandalkan praktik yang ada - shell sesuai karena tidak ada yang bertentangan dengan standar tertulis, tetapi standar tidak dapat digunakan untuk memprediksi perilaku dalam semua kasus.
  • komentar yang sama berlaku, tentu saja, pada perilaku alias (itulah sebabnya saya menyebutnya sebagai pertanyaan serupa ).
Thomas Dickey
sumber
atau jika Anda baik-baik saja dengan mengutip neraka,env foo=bar bash -c 'echo $foo'
badp
Sebenarnya, pertanyaan alias bergantung pada implikasi bagian token-recognition bahwa token semua dihitung untuk garis yang diberikan sebelum pindah ke tata bahasa. Tetapi untuk keduanya, standarnya tidak eksplisit , membuat Anda bergantung pada praktik yang ada.
Thomas Dickey
@ thomasdickey - ya, itu intisari saya juga. Anda tahu, ketika Anda menulis komentar jika Anda melakukan @username...commentpengguna yang Anda tentukan akan mendapat sedikit pesan yang memberi tahu mereka bahwa Anda sedang berbicara dengan mereka. baik, mereka akan jika utasnya relevan.
mikeserv
@ mikeserv (seperti ini). hmm - Saya akan mengingatnya (meskipun cara kerjanya dengan blank kosong tidak terlihat).
Thomas Dickey
seperti itu. secara tangensial, saya telah melihat luit.cdan saya pikir saya bisa mengubah setup_io(){ ... ;fnctl(0, [GS]ETFL, 0);...}untuk melakukan 2argumen pertama. baik, saya kira copyTermios()dan setRawTermios()fungsinya mungkin perlu sedikit modifikasi juga, tetapi harus sederhana, saya pikir. yang rc = (return)untuk setiap baris tampak aneh - tapi aku tidak ada C programmer baik. Apakah itu milik Anda atau apakah itu warisan? dan jika komentar kosong Anda mengacu pada "${set_null_var:=new val and $(echo other stuff)}"Anda sebagian besar aman tanpa apa-apa. beberapa kerang akan melakukan hal-hal aneh }.
mikeserv