2013-07-30 45 views
47

Tôi đã cố gắng tạo một "bí danh" cho một đường dẫn mà tôi sử dụng thường xuyên trong khi tạo kịch bản lệnh shell. Tôi đã thử một cái gì đó, nhưng nó đã thất bại:Làm cách nào để tạo "bí danh" cho đường dẫn dài?

myFold="~/Files/Scripts/Main" 
cd myFold 

bash: cd: myFold: No such file or directory 

Làm cách nào để làm cho nó hoạt động?
Tuy nhiên, cd ~/Files/Scripts/Main hoạt động.

Trả lời

66

Vì nó là một biến môi trường (bí danh có một định nghĩa khác nhau trong bash), bạn cần phải đánh giá nó với một cái gì đó như:

cd "${myFold}" 

hay:

cp "${myFold}/someFile" /somewhere/else 

Nhưng Tôi thực sự thấy dễ dàng hơn, nếu bạn chỉ muốn dễ dàng chuyển sang thư mục đó, để tạo một thực alia mới s (tại một trong những bash file khởi động như .bashrc), vì vậy tôi có thể tiết kiệm tổ hợp phím:

alias myfold='cd ~/Files/Scripts/Main' 

Sau đó, bạn chỉ có thể sử dụng (không có cd):

myfold 

Để thoát khỏi định nghĩa , bạn sử dụng unalias. Các chương trình bảng điểm sau tất cả những trong hành động:

pax> cd ; pwd ; ls -ald footy 
/home/pax 
drwxr-xr-x 2 pax pax 4096 Jul 28 11:00 footy 

pax> footydir=/home/pax/footy ; cd "$footydir" ; pwd 
/home/pax/footy 

pax> cd ; pwd 
/home/pax 

pax> alias footy='cd /home/pax/footy' ; footy ; pwd 
/home/pax/footy 

pax> unalias footy ; footy 
bash: footy: command not found 
+0

Cảm ơn. Điều đó hoạt động. Tôi đã thử chỉ bí danh myfold = '~/some/path' và cd myfold. Tôi gặp lỗi - không có thư mục như vậy. Tại sao ? Ngoài ra, có thể "bỏ gán" biến bí danh không? – bashboy

+0

myfold = '~/some/path' cd "$ myfold" Không. Tại sao ? – bashboy

+0

@bashboy, có thể vì bạn không có thư mục nào có tên đó. ~/some/path là một ví dụ, bạn nên thay thế đường dẫn _actual_ mà bạn muốn sử dụng. Tôi sẽ thay đổi nó để sử dụng thư mục ví dụ của bạn để nó rõ ràng hơn. Về cách bỏ gán một bí danh, bạn sử dụng lệnh unalias. Tôi cũng đã cập nhật câu trả lời bằng một bảng điểm, bao gồm cả việc sử dụng lệnh đó. – paxdiablo

3

Trước tiên, bạn cần $ để truy cập "myFold" 's giá trị để làm cho đoạn code trong công việc câu hỏi:

cd "$myFold" 

Để đơn giản hóa này, bạn tạo một bí danh trong ~/.bashrc:

alias cdmain='cd ~/Files/Scripts/Main' 

Đừng quên nguồn .bashrc một lần để làm cho bí danh trở nên có sẵn trong phiên bash hiện tại:

source ~/.bashrc 

Bây giờ bạn có thể thay đổi vào thư mục sử dụng:

cdmain 
1

nhưng một bí danh thực tế cho một dir Cũng có thể, hãy thử

myScripts="~/Files/Scripts/Main" 
alias myScripts="cd $myScripts" 

Bằng cách này bạn có một quy ước đặt tên chung (cho mỗi cặp dir/alias), và nếu bạn cần sao chép một thứ gì đó từ thư mục hiện tại sang myScripts, bạn không cần phải suy nghĩ về nó.

IHTH

5

Trước hết, bạn cần phải loại bỏ các dấu ngoặc kép:

[email protected]:~$ myFolder=~/Files/Scripts/Main 

các dấu ngoặc kép ngăn chặn vỏ từ mở rộng dấu ngã để ý nghĩa đặc biệt của nó là thư mục $HOME của bạn.

Sau đó bạn có thể sử dụng $myFolder một môi trường một biến shell:

[email protected]:~$ cd $myFolder 
[email protected]:~/Files/Scripts/Main$ 

Để thực hiện alias, bạn cần phải xác định bí danh:

alias="cd $myFolder" 

Sau đó, bạn có thể điều trị này giống như một lệnh:

[email protected]:~$ myFolder 
[email protected]:~/Files/Scripts/Main$ 
.210
+0

Nó không thực sự là một biến * môi trường * trừ khi bạn 'export' nó. –

+0

@KeithThompson Được rồi, đó chỉ là biến _shell_. Tuy nhiên, bạn không muốn xuất nó vì bạn không muốn nó có thể ảnh hưởng đến các tiến trình con. Bạn định nghĩa nó theo cách này trong '.bashrc' hoặc bất kỳ tệp tài nguyên nào bạn sử dụng, và nó sẽ được định nghĩa trong hệ vỏ ngay lập tức, nhưng không được định nghĩa trong các kịch bản lệnh shell. –

+0

Tôi thích giải pháp này hơn vì nó hoạt động với tính năng tự động hoàn thành – Vassilis

1

Bạn có thể thêm bất kỳ đường dẫn bạn muốn Hashtable của bash của bạn:

hash -d <CustomName>=<RealPath>

Bây giờ bạn sẽ có thể cd ~<CustomName>. Để làm cho nó vĩnh viễn thêm nó vào tập lệnh bashrc của bạn.

Lưu ý rằng hashtable này có nghĩa là cung cấp bộ đệm cho bash không cần tìm kiếm nội dung mỗi khi lệnh được thực thi, do đó bảng này sẽ bị xóa trên các sự kiện làm mất hiệu lực bộ nhớ cache, ví dụ: sửa đổi $PATH.

29

Có một tùy chọn vỏ cdable_vars:

cdable_vars
Nếu đây được thiết lập, một cuộc tranh cãi với cd BUILTIN lệnh đó không phải là một thư mục được giả định là tên của một biến có giá trị là thư mục để thay đổi.

Bạn có thể thêm video này vào bạn .bashrc:

shopt -s cdable_vars 
export myFold=$HOME/Files/Scripts/Main 

Chú ý rằng tôi đã thay thế dấu ngã với $HOME; báo giá ngăn chặn việc mở rộng dấu ngã và Bash sẽ phàn nàn rằng không có thư mục nào ~/Files/Scripts/Main.

Bây giờ bạn có thể sử dụng điều này như sau:

cd myFold 

Không $ yêu cầu. Đó là toàn bộ điểm, thực tế là – như được hiển thị trong các câu trả lời khác, cd "$myFold" hoạt động mà không có tùy chọn trình bao. cd myFold cũng hoạt động nếu đường dẫn trong myFold chứa khoảng trắng, không yêu cầu trích dẫn.

này thường thậm chí làm việc với tab autocompletion như _cd chức năng trong bash_completion kiểm tra nếu cdable_vars được thiết lập – nhưng không phải mọi thực hiện nó theo cách tương tự, vì vậy bạn có thể có nguồn bash_completion một lần nữa trong .bashrc của bạn (hoặc chỉnh sửa /etc/profile để đặt tùy chọn trình bao).

1

Một tùy chọn khác sẽ là sử dụng liên kết tượng trưng.ví dụ:

ln -s ~/Files/Scripts/Main ~/myFold 

Sau đó bạn có thể thực hiện các hoạt động để ~/myFold, chẳng hạn như:

cp some_file.txt ~/myFold 

mà sẽ đặt các tập tin trong ~/Files/Scripts/Main. Bạn có thể xóa liên kết tượng trưng bất kỳ lúc nào bằng rm ~/myFold, sẽ giữ thư mục gốc.