Không gian trong các biến môi trường Linux?


4

Thư mục đã cho: /media/foo/can haz/bar, Tôi đã thử chỉnh sửa bash.rc với:

export Foo=/media/foo/can haz/bar
export Foo=/media/foo/can\ haz/bar
export Foo='/media/foo/can haz/bar'
export Foo="/media/foo/can haz/bar"
export Foo='"/media/foo/can haz/bar"'
export Foo="'/media/foo/can haz/bar'"

Mỗi lần, tôi không thể làm gì đó như sau để làm việc (mà không sử dụng "$Foo" ):

cd $Foo

Làm cách nào để đặt biến môi trường có khoảng trắng trên hệ thống Linux?


Có lẽ nếu tôi đặt bí danh hoặc một cái gì đó?
A T

Câu trả lời:


8

Vấn đề không phải là biến môi trường của bạn chứa một khoảng trắng. Bạn đang quên trích dẫn lập luận của bạn :

cd "$Foo"

Nếu bạn không trích dẫn $Foo, các cd lệnh thực sự sẽ thấy hai (hoặc nhiều) đối số, vì khoảng trắng theo mặc định phân tách các đối số . Trong trường hợp cụ thể của bạn, bạn sẽ vượt qua /media/foo/canhaz/bar riêng biệt, vì vỏ tách chúng tại không gian. Biến trích dẫn kép là một thói quen tốt để phát triển và sẽ giúp bạn tiết kiệm trong khá nhiều trường hợp có khoảng trắng.

Nếu bạn muốn một cách thực sự xấu xí để đạt được điều này mà không có dấu ngoặc kép, hãy ghi đè lên cd dựng sẵn như vậy:

cd() { builtin cd "$*"; }

Điều này sẽ hoạt động nếu đường dẫn chứa khoảng trắng, vì $* sẽ chứa các đối số riêng lẻ ( /media/foo/canhaz/bar .

Mặc dù vậy, không bao giờ nên ghi đè lên các nội dung như thế này.


Như đã đề cập, tôi muốn tránh làm điều đó; đó là toàn bộ vấn đề tôi đang cố gắng giải quyết.
A T

Bạn đã lén phần đó trong? Tôi không nhớ nó đã ở đó trong lần sửa đổi đầu tiên của câu hỏi tôi đã thấy :) Dù sao đi nữa, câu hỏi của bạn là "Làm thế nào để tôi đặt biến môi trường với một khoảng trắng?", Và câu trả lời là, bạn có thể làm điều đó. Làm thế nào bạn xử lý nó là một vấn đề khác nhau và bạn không thể làm cho nó hoạt động mà không có dấu ngoặc kép chỉ là vấn đề làm thế nào vỏ hoạt động.
slhck

@AT Bạn đã xem cập nhật của tôi chưa?
slhck

2

Như @slhck đã nói, cách chính xác để làm điều này là đặt dấu ngoặc kép xung quanh tham chiếu biến (ví dụ: cd "$Foo" ). Lý do cho điều này là thứ tự shell phân tích các khía cạnh khác nhau của dòng lệnh: đầu tiên nó quét các dấu ngoặc kép và thoát (và loại bỏ chúng khi nó áp dụng hiệu ứng của chúng), sau đó nó thay thế các tham chiếu biến bằng các giá trị của chúng (ví dụ $Foo - & gt; /media/foo/can haz/bar ), sau đó nó quay trở lại qua các giá trị được thay thế và áp dụng mở rộng ký tự đại diện ( *.txt - & gt; a.txt b.txt v.v.) và tách từ ( /media/foo/can haz/bar - & gt; "/ media / foo / can" "haz / bar"), nhưng nó không bao giờ quay lại và tìm dấu ngoặc kép và / hoặc thoát trong các giá trị biến. Kết quả là, nhúng dấu ngoặc kép và / hoặc thoát trong giá trị của biến không có gì thậm chí hơi hữu ích ; tại thời điểm chúng là một phần của dòng lệnh, đã quá muộn để chúng có hiệu lực như mong muốn. Tôi chỉ biết ba cách để tránh chia từ trên giá trị mở rộng:

  1. Trích dẫn kép các tham chiếu biến. Nó không thuận tiện, nhưng đó là một yêu cầu của cú pháp shell tiêu chuẩn.
  2. Thay đổi giá trị của IFS (danh sách các ký tự được sử dụng để phân tách từ trên các biến mở rộng). Sau đó xem tất cả các tập lệnh phụ thuộc vào hành vi phân tách từ tiêu chuẩn phá vỡ một cách kỳ lạ. Xin đừng làm điều này. Nghiêm túc.
  3. Chuyển sang hệ vỏ không thực hiện phân tách từ trên các biến mở rộng: zsh. Bạn sẽ phải làm quen với những khác biệt khác của nó từ bash, nhưng nếu bạn thực sự muốn điều này, đó là cách tốt nhất để đi. Tôi không sử dụng nó cho mình, nhưng những người dường như rất thích nó ...

Zsh cũng tự động hoàn thành cd $Foo đến cd /path\ with/spaces. Tôi đã tìm thấy Bash để làm điều này sai nếu bạn kích hoạt nó với Ctrl-A-E, nhưng tôi đã không sử dụng Bash trong một thời gian, vì vậy có thể cũng có thể định cấu hình này.
slhck
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.