Làm thế nào để tạo "bí danh" cho một con đường dài?


94

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

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/Mainhoạt động.

Câu trả lời:


119

Vì nó là một biến môi trường (bí danh có một định nghĩa khác trong bash), bạn cần đánh giá nó bằng những thứ như:

cd "${myFold}"

hoặc là:

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

Nhưng tôi thực sự thấy nó dễ dàng hơn, nếu bạn chỉ muốn dễ dàng chuyển đổi vào thư mục đó, để tạo bí danh thực (trong một trong các bashtệp khởi động như .bashrc), vì vậy tôi có thể lưu các lần nhấn 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. Bản ghi sau đây cho thấy tất cả những điều này đang hoạt độ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

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" một biến bí danh không?
bashboy

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

1
@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 thực tế mà bạn muốn sử dụng. Tôi sẽ thay đổi nó để sử dụng thư mục mẫu của bạn để nó rõ ràng hơn. Về cách bỏ gán 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 bản ghi, bao gồm cả việc sử dụng lệnh đó.
paxdiablo,

Bạn sẽ giữ bí danh này như thế nào trong các phiên đầu cuối khác nhau? Khi tôi mở một tab mới và cố gắng sử dụng bí danh này, nó không hoạt động.
goldisfine

4
@goldisfine, xem dấu ngoặc đơn của tôi in one of the bash startup files like .bashrc. Đặt bí danh vào một tệp khởi động phù hợp sẽ đảm bảo nó có sẵn cho tất cả các phiên.
paxdiablo

74

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

cdable_vars
Nếu điều này được đặt, đối số cho cdlệnh nội trang không phải là thư mục được giả định là tên của một biến có giá trị là thư mục cần thay đổi.

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

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

Lưu ý rằng tôi đã thay thế dấu ngã bằng $HOME; dấu ngoặc kép ngăn chặn mở rộng dấu ngã và Bash sẽ phàn nàn rằng không có thư mục ~/Files/Scripts/Main.

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

cd myFold

Không $yêu cầu. Đó là toàn bộ điểm, thực sự - 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 shell. cd myFoldcũng hoạt động nếu đường dẫn trong myFoldchứa khoảng trắng, không cần trích dẫn.

Điều này thậm chí thường hoạt động với tính năng tự động hoàn thành tab khi _cdhàm trong bash_completionkiểm tra xem cdable_varscó được đặt hay không - nhưng không phải mọi triển khai đều thực hiện theo cùng một cách, vì vậy bạn có thể phải lấy bash_completionlại nguồn trong .bashrc(hoặc chỉnh sửa /etc/profileđể đặt tùy chọn shell).


Các trình bao khác có các tùy chọn tương tự, ví dụ Zsh ( cdablevars).


1
Có tương đương với điều này cho ZSH không?
Ryan Stull

1
@RyanStull có setopt cdablevarsvẻ như vậy, nhưng tôi không biết zsh cả.
Benjamin W.

@JohnMee Tôi sẽ quay lại chỉnh sửa của bạn, vì a) tùy chọn được gọi là khác nhau trong zsh (không có gạch dưới) b) câu hỏi được gắn thẻ chỉ Bash và c) Tôi liên kết đến hướng dẫn sử dụng Bash. Tuy nhiên, tôi sẽ thêm một đoạn để đề cập đến các shell khác.
Benjamin W.

1
Như một câu trả lời tuyệt vời! Cảm ơn bạn rất nhiều vìcdable_vars
Lucas P.

1
@Vladislav Lưu ý rằng điều đó phá vỡ hoàn thành cdđược cung cấp bởi hoàn thành bash, sử dụng _cdhàm ( complete -o nospace -F _cd cd). Thêm -vvào đó (để hoàn thành trên các biến) hoạt động, nhưng có thể có tác dụng phụ không mong muốn - đối với tôi, nó cho thấy môi trường hoàn chỉnh của tôi khi tôi hoàn thành tab.
Benjamin W.

10

Có lẽ tốt hơn nên sử dụng liên kết

Liên kết mềm

Liên kết tượng trưng hoặc mềm (tệp hoặc thư mục, linh hoạt hơn và tự lập tài liệu)

#      Source                            Link
ln -s /home/jake/doc/test/2000/something /home/jake/xxx

Liên kết cứng

Liên kết cứng (chỉ các tệp, kém linh hoạt và không tự lập tài liệu)

#    Source                            Link
ln /home/jake/doc/test/2000/something /home/jake/xxx

Cách tạo liên kết đến một thư mục

Gợi ý : Nếu bạn không cần xem liên kết trong nhà, bạn có thể bắt đầu bằng dấu chấm. ; thì mặc định nó sẽ bị ẩn sau đó bạn có thể truy cập như

cd ~/.myHiddelLongDirLink

9

Bạn có thể thêm bất kỳ đường dẫn nào bạn muốn vào bảng băm của bash của mình:

hash -d <CustomName>=<RealPath>

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

Lưu ý rằng bảng băm này có nghĩa là cung cấp một bộ đệm để bash không cần tìm kiếm nội dung mỗi khi một 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ộ đệm, ví dụ như sửa đổi $PATH.


2
Tôi nghĩ rằng nó sẽ chỉ hoạt động trong zshnhưng không hoạt động bash.
sergej

Đây là câu trả lời tốt nhất IMHO, nhưng đúng là nó chỉ hoạt động zshtrên hệ thống Ubuntu của tôi.
John Stewart

6

Trước hết, bạn cần xóa các dấu ngoặc kép:

bashboy@host:~$ myFolder=~/Files/Scripts/Main

Các dấu ngoặc kép ngăn không cho shell mở rộng dấu ngã thành ý nghĩa đặc biệt của nó là trở thành $HOMEthư mục của bạn .

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

bashboy@host:~$ cd $myFolder
bashboy@host:~/Files/Scripts/Main$

Để tạo bí danh , bạn cần xác định bí danh:

alias myfolder="cd $myFolder"

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

bashboy@host:~$ myFolder
bashboy@host:~/Files/Scripts/Main$

Nó không thực sự là một biến môi trường trừ khi bạn có exportnó.
Keith Thompson,

1
@KeithThompson Được rồi, nó chỉ là một 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, nó trong .bashrctệp tài nguyên của bạn 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 shell ngay lập tức, nhưng không phải trong shell script.
David W.

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 tất
Vassilis

5

Đầu tiên, bạn cần $truy cập giá trị của "myFold" để làm cho mã trong câu hỏi hoạt động:

cd "$myFold"

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

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

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

source ~/.bashrc

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

cdmain

4

Một lựa chọn khác là sử dụng một liên kết tượng trưng. I E:

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

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

cp some_file.txt ~/myFold

sẽ đưa tệp vào ~/Files/Scripts/Main. Bạn có thể xóa liên kết tượng trưng bất kỳ lúc nào với rm ~/myFold, liên kết này sẽ giữ nguyên thư mục gốc.


Một nhược điểm: Nếu bạn cd myFoldsau đó pwd, nó sẽ cho thấy bạn đang ở trong myFold. Đây là một công cụ phá vỡ thỏa thuận đối với tôi vì các lệnh tương đối với điều khiển nguồn p4 phụ thuộc vào thư mục hiện tại.
Người dùng5910

1
@ User5910 - sử dụngpwd -P
DVJ

2

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 thứ gì đó từ dir hiện tại sang myScripts, bạn không cần phải suy nghĩ về nó.

IHTH


1

Các câu trả lời trước mà tôi đã thử không cho phép mở rộng tự động (tự động hoàn thành) các thư mục con của thư mục bí danh.

Tuy nhiên, nếu bạn đẩy thư mục mà bạn muốn đặt bí danh vào dirsngăn xếp ...

$ pushd ~/my/aliased/dir

... sau đó bạn có thể nhập dirs -vđể xem vị trí số của nó trong ngăn xếp:

 0  ~/my/aliased/dir
 1  ~/Downloads
 2  /media/usbdrive

và tham chiếu đến nó bằng cách sử dụng số đó cho hầu hết nếu không phải tất cả các lệnh yêu cầu tham số thư mục:

 $ mv foo.txt ~0  

Bạn thậm chí có thể sử dụng Tabđể hiển thị các thư mục con ngay lập tức của thư mục "bí danh":

 $ cd ~0/<Tab>
 child_dir1    child_dir2

-1

Đặt dòng sau vào bảng huyền thoại của bạn

set myFold = '~/Files/Scripts/Main'

Trong việc sử dụng thiết bị đầu cuối

source myscript
cd $myFold
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.