`env foo = bar echo $ foo` không in gì cả


8

Tôi nghĩ rằng tôi đang có một bộ não lớn. Tôi mong chờ

env foo=bar echo $foo

... Để in bar, nhưng tôi nhận được một dòng trống thay thế. Wat.

Điều tương tự cũng xảy ra nếu tôi sử dụng cú pháp bash:

foo=bar echo $foo

Câu trả lời:


8

Một câu hỏi tương tự đã được trả lời gần đây : các ký hiệu được đánh giá trong dòng trước khi ký hiệu được xác định trong dòng này, khiến cần phải phân tách định nghĩa và sử dụng các ký hiệu để phân tách các dòng.

Được nhắc nhở bởi một bình luận, bạn có thể đã làm điều này:

foo=bar bash -c 'echo $foo'

cái đầu tiên gán một giá trị cho foovà chuyển nó vào một quy trình mới dưới dạng một biến môi trường nơi nó có thể được in.

Bạn có thể đọc thêm về nó trong nhận dạng mã thông báo ngôn ngữ lệnh POSIX Shell .

Theo dõi từ bình luận @mikeerv :

  • POSIX không đủ rõ ràng để đưa ra toàn bộ câu trả lời.
  • Ở đầu phần trích dẫn, nó nói

    Shell sẽ đọc đầu vào của nó theo các dòng từ một tệp, từ một thiết bị đầu cuối trong trường hợp vỏ tương tác hoặc từ một chuỗi trong trường hợp sh -c hoặc system ().

  • cuối cùng, nó nói

    Khi mã thông báo được phân định, nó được phân loại theo yêu cầu của ngữ pháp trong Shell Grammar.

  • nhưng POSIX không nói rõ ràng rằng toàn bộ dòng được mã hóa trước khi làm việc với ngữ pháp.
  • trong trường hợp đó, chúng tôi dựa vào thực tiễn hiện có - vỏ phù hợp vì không có gì mâu thuẫn với tiêu chuẩn bằng văn bản, nhưng tiêu chuẩn không thể được sử dụng để dự đoán hành vi trong mọi trường hợp.
  • tất nhiên, cùng một nhận xét áp dụng cho hành vi của các bí danh (đó là lý do tại sao tôi gọi nó là một câu hỏi tương tự ).

hoặc nếu bạn ổn với việc trích dẫn địa ngục,env foo=bar bash -c 'echo $foo'
badp

Trên thực tế, câu hỏi bí danh dựa trên hàm ý của phần nhận dạng mã thông báo rằng tất cả các mã thông báo được tính cho một dòng nhất định trước khi chuyển sang ngữ pháp. Nhưng đối với cả hai, tiêu chuẩn không rõ ràng , khiến bạn dựa vào thực tiễn hiện có.
Thomas Dickey

@thomasdickey - ừ, đó cũng là ý chính của tôi. bạn biết đấy, khi bạn viết bình luận nếu bạn làm @username...commentngười dùng mà bạn chỉ định sẽ nhận được một tin nhắn nhỏ cho họ biết bạn đang nói chuyện với họ. tốt, họ sẽ nếu chủ đề của nó liên quan.
mikeerv

@mikeerv (như thế này). hmm - Tôi sẽ ghi nhớ điều đó (mặc dù cách nó hoạt động với các khoảng trống được nhúng không rõ ràng).
Thomas Dickey

như thế tiếp theo, tôi đã xem xét luit.cvà tôi nghĩ rằng tôi chỉ có thể thay đổi setup_io(){ ... ;fnctl(0, [GS]ETFL, 0);...}để làm 2cho đối số đầu tiên. tốt, tôi đoán rằng copyTermios()và các setRawTermios()chức năng có thể cần một chút sửa đổi, nhưng nó sẽ đơn giản, tôi nghĩ vậy. các rc = (return)cho mỗi dòng có vẻ lạ - nhưng tôi không có lập trình C trong hai. đó là thứ của bạn hay được thừa hưởng? và nếu bình luận trống của bạn đề cập đến "${set_null_var:=new val and $(echo other stuff)}"bạn hầu như an toàn với bất cứ điều gì. một số vỏ sẽ làm những thứ kỳ lạ với }.
mikeerv
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.