Khi bash mở rộng $dir
, nó chỉ thực hiện tách từ và tạo khối trên nó. Lời chia tách tạo ra ba chữ: cd
, "/cygdrive/c/Program
và Files/"
. Sau đó, lệnh để thực hiện là cd
với hai đối số; cd
chỉ nhìn vào đối số đầu tiên của nó "/cygdrive/c/Program
, không phải là một thư mục hiện có.
Nếu bạn muốn thực hiện đánh giá toàn bộ vỏ trên nội dung của một biến, hãy sử dụng eval
:
eval "$dir"
Lưu ý rằng bạn cần dấu ngoặc kép xung quanh $dir
, nếu không, việc tách từ sẽ được thực hiện trước tiên, sau đó eval
sẽ nối các đối số của nó với khoảng trắng. Điều này sẽ xảy ra để làm việc ở đây, nhưng nói chung sẽ trở nên tồi tệ (ví dụ nếu có hai khoảng trắng liên tiếp trong một tên tệp).
Tuy nhiên, một chuỗi không phải là cách đúng để lưu trữ lệnh shell mà bạn muốn thực thi. Trừ khi bạn có một yêu cầu bất thường, bạn nên sử dụng một chức năng thay thế:
dir () {
cd "/cygdrive/c/Program Files/"
}
Nếu bạn thực sự quan tâm đến việc gõ $dir
để chuyển sang một thư mục cụ thể và đây không chỉ là một ví dụ đơn giản, vì bash 4, hãy đặt và đặt shopt -s autocd
của bạn.bashrc
dir="/cygdrive/c/Program Files/"
sau đó bạn có thể gõ chỉ "/cygdrive/c/Program Files/"
hoặc "$dir"
tại dấu nhắc shell để chuyển sang thư mục đó. Bạn vẫn cần các trích dẫn kép xung quanh $dir
; nếu bạn không thích điều đó, hãy sử dụng zsh thay vì bash.