2012-06-23 30 views
15

Tôi khá mới để bash, và tôi muốn bao gồm một env cho bí danh bash .. Tôi muốn làm một cái gì đó như sauLàm cách nào để bao gồm biến môi trường bên trong bí danh cho bash?

alias foo="bar $(baz)" 

Vì vậy mà tôi có thể làm một cái gì đó như sau

> baz=40 
> foo 

và foo sẽ mở rộng đến lệnh bar 40. Hiện tại ở trên không hoạt động vì $ (baz) được mở rộng trong khi tạo bí danh. Tôi có phải quấn nó bên trong một chức năng hay gì đó không?

Trả lời

31

Bạn cần phải sử dụng dấu ngoặc đơn (') để ngăn chặn bash từ mở rộng biến khi tạo bí danh:

$ alias foo='echo "$bar"' 
$ bar="hello" 
$ foo 
hello 
+1

Ngoài ra 'bí danh thử nghiệm = echo \ $ bar' (cùng một ý tưởng, mở rộng bị đàn áp) –

+4

câu trả lời đúng, chỉ cần cẩn thận răng cưa' thử nghiệm', nó là một lệnh thực tế. – Kevin

+4

'alias foo = 'echo" $ bar "''. 'Xuất khẩu' là không cần thiết. – ormaaj

4

biệt hiệu không có một "môi trường". Bí danh chỉ đơn giản là thay thế văn bản "câm". Trong câu hỏi, một biến môi trường không được sử dụng - chỉ là một biến shell. Nếu bạn muốn sử dụng môi trường, hãy sử dụng một hàm. Trong trường hợp này, không có lợi thế cho một bí danh trên một hàm.

$ alias foo='echo "$bar"' 
$ bar=hi foo 

Điều này không tạo đầu ra vì môi trường được đặt cho lệnh đơn giản không áp dụng cho mở rộng.

$ alias foo=$'eval \'echo "$bar"\'' 
$ bar=hi foo 
hi 

Nếu một hàm được sử dụng thay thế, sẽ không có vấn đề gì.

$ foo() { echo "$bar"; } 
$ bar=hi foo 
hi 

Khi nghi ngờ, hãy luôn sử dụng chức năng.

Sửa

Về mặt kỹ thuật, phía trên là bash-only. Làm điều này một cách hoàn toàn di động là gần như không thể.

Trong dash, mksh, chế độ POSIX bash, và vỏ POSIX khác mà bạn có thể làm:

foo() { echo "$bar"; } 
bar=hi command eval foo 

Tuy nhiên, điều này sẽ không làm việc trong ksh93 hoặc zsh. (Tôi đã báo cáo lỗi cho ksh93 nhưng nó có thể không bao giờ được sửa.) Trong mksh và ksh93, bạn nên định nghĩa các hàm bằng cách sử dụng từ khóa function, nhưng đó không phải là POSIX. Tôi không biết bất kỳ giải pháp nào sẽ hoạt động ở mọi nơi.

Để làm cho vấn đề trở nên tồi tệ hơn, ngoại lệ thêm sẽ được thêm vào POSIX 2008-TC1 để cách thức hoạt động của môi trường sẽ phức tạp hơn. Tôi đề nghị không sử dụng chúng trừ khi bạn thực sự biết những gì bạn đang làm.

Các vấn đề liên quan