Tạo một lối tắt khác `~ ~` like `~` (thư mục chính)


10

Tôi muốn ~~trỏ đến một thư mục khác để tôi có thể sử dụng nó như một phím tắt. Tôi muốn nó có chức năng chính xác như ~. Tôi có thể làm cái này như thế nào?


2
Bạn có thể tốt hơn với các thư mục có tên zsh
Michael Mrozek

Chỉ cần tìm một giải pháp thú vị cho vấn đề superuser.com/a/565825/398328
VarunAgw

1
@VarunAgw haha, Vui tìm thấy, đúng như tôi đã nghĩ về cùng một giải pháp. Xấu hổ. Tôi nghĩ rằng tôi là một con bướm độc đáo trong một phút :(
Gravy

Câu trả lời:


14

Thật ra, có một cách, đó không phải là một cách hay, nhưng đó là một cách, haha!

Thêm phần sau vào /etc/passwdtập tin của bạn :

~:x:1111:99:special Character user:/test:/sbin/nologin

thay thế 1111UID bằng một cái gì đó có ý nghĩa, thay thế /testbằng thư mục bạn muốn ~ ~ để bắt chước.

99trên hệ thống của tôi là nobodynhóm tôi khuyên bạn nên làm điều này để đảm bảo đó là nhóm không có quyền trên bất kỳ tệp nào sẽ được sử dụng. Về mặt lý thuyết với /sbin/nologinvỏ như vậy, nó không thể được sử dụng, nó cũng sẽ không có /etc/shadowmục để nó không có mật khẩu. Về mặt lý thuyết sẽ ổn, nhưng hãy chắc chắn rằng bằng cách nào đó không cho phép bạn đăng nhập như tài khoản.

Như một lưu ý phụ: Tôi không nói cách nào đây là một ý tưởng hay, nhưng nó sẽ hoàn thành chức năng mà bạn muốn.

EDIT: Để hoàn thiện, điều này được VarunAgw đề xuất: Bạn có thể thêm người dùng như bình thường useradd -s /sbin/nologin -N tmpvà sau đó sửa đổi /etc/passwd/etc/shadowthay đổi người dùng tmpthành ~và thay đổi vị trí củahome directory


Thay vì thay đổi UID và GID, chúng ta có thể useradd 'tmp'thay thế tmpbằng~
VarunAgw

Thật. gợi ý tốt. Tôi không chắc tôi cảm thấy thế nào về việc hợp pháp hóa nó với một shadowmục nhưng tôi cho rằng miễn là không có mật khẩu nào được đặt thì nó không thực sự là một rủi ro bổ sung.
Gravy

8

Bạn có thể sử dụng CDPATH và đặt một thư mục có tên theo nghĩa đen ~~ trong một trong các thành phần CDPATH của bạn.

Từ man bash(nhưng CDPATH có sẵn ngay cả trong sh)

Đường dẫn tìm kiếm cho lệnh cd. Đây là danh sách các thư mục được phân tách bằng dấu hai chấm trong đó shell tìm kiếm các thư mục đích được chỉ định bởi lệnh cd. Giá trị mẫu là ".: ~: / Usr".

Điều đó sẽ cho phép bạn làm cd ~~.

Nếu bạn muốn làm những việc như vi ~~/someFiletừ bất cứ đâu trong cây thư mục, thì bạn sẽ không gặp may nếu bạn khăng khăng theo ~~nghĩa đen trừ khi bạn hack vỏ của mình, tuy nhiên, bạn có thể sử dụng biến hoặc biến môi trường để lưu trữ thư mục ma thuật của mình để bạn có thể làm , ví dụ,$tilda/someFile

Tôi thường đặt các tệp thường được truy cập bên trong các thư mục được đặt tên ngắn trong thư mục chính của mình để tôi có thể truy cập chúng bằng các đường dẫn như ~/bhoặc ~/l.

Đương nhiên, bạn thường có thể thay thế các thư mục bằng các liên kết tượng trưng đến các thư mục nhiều như bạn muốn.


1

~Mở rộng dấu ngã của phần lớn là lập trình. Nó mở rộng đến thư mục người dùng của tên người dùng hệ thống được khai báo trong ngữ cảnh kéo dài của nó (và một giải pháp tuyệt vời dọc theo các dòng này đã được cung cấp) , giá trị của $HOMEbiến shell hoặc hoàn toàn không.

Vì thế:

(HOME=/tmp; cd ~)
pwd; echo "$HOME"

/tmp
/home/mikeserv

Tôi thay đổi $HOMEtất cả thời gian và tôi giữ một hàm trong tệp môi trường của shell để đặt lại nó:

home(){
    HOME=~$USER
    cd ~; pwd
}

Nếu bạn muốn sử dụng ~dấu ngã theo cách nào đó không tham chiếu đến thư mục chính của bạn, thì hãy làm như vậy . Chỉ cần gán lại $HOME. Đừng sợ nó. $HOMEchỉ là một biến shell như bất kỳ khác.


Một đề nghị khác mà tôi có chỉ là mở rộng một chút về lời khuyên tuyệt vời của @ PSkocik về việc sử dụng $CDPATH. Tuy nhiên, một điều ông không đề cập là bạn có thể sử dụng và thay đổi $CDPATHnội tuyến mà không thay đổi giá trị shell hiện $CDPATHtại. Ví dụ:

mkdir -p /tmp/1/2
CDPATH=/tmp cd 1/2

/tmp/1/2

cdnhất thiết phải là một phần tử dựng sẵn, nhưng nó không phải là phần dựng đặc biệt của POSIX và do đó, việc khai báo giá trị $CDPATHkhông ảnh hưởng đến giá trị trình bao hiện tại của nó. Nếu bạn sử dụng nó như tôi đã làm ở trên $CDPATH, giá trị của nó chỉ bị thay đổi đối với môi trường của một cdlệnh và sau đó được khôi phục về giá trị trước đó. Tôi có xu hướng tìm thấy các kỹ thuật trên hữu ích nhất khi được sử dụng kết hợp với hoàn thành lịch sử. Tôi sẽ làm những điều trên, thay đổi một thư mục, chạy một vài lệnh, sau đó nhấn lên cho đến khi tôi quay lại cdlệnh của mình và sao lưu một hoặc hai đoạn đường dẫn để di chuyển đi nơi khác.


Bây giờ nếu bạn kết hợp hai khái niệm này thì bạn có thể tạo một lệnh được sử dụng trước đó có nghĩa là một cái gì đó hoàn toàn khác vào lần tiếp theo bạn sử dụng nó.

for HOME in /tmp ~
do  mkdir -p ~/1/2
    CDPATH=~ cd 1/2
done

/tmp/1/2
/home/mikeserv/1/2

0

Hoạt động hoàn hảo như một chức năng bash:

$ function ~~ { cd /tmp; }
$ pwd
/home/jackman
$ ~~
$ pwd
/tmp
$ cd -
$ pwd
/home/jackman

Đây là một cách tiếp cận khác gần hơn một chút (Tôi biết rằng tôi không đạt được yêu cầu đó)

function ~~ { echo /test; }

Sau đó, với một vài nhân vật nữa:

cd `~~`/subdir
vi `~~`/file

2
Chà, cd ~~/foo/barsẽ không hoạt động tốt như vậy, hay vim ~~/foo.txt, v.v ...
derobert

1
Câu hỏi không rõ ràng. Nếu đó là cách sử dụng mong muốn, tôi sẽ sử dụng CDPATHbiến để xử lý cdtrường hợp.
glenn jackman

Đồng ý rằng nó không hoàn toàn rõ ràng, nhưng OP yêu cầu nó hoạt động như thế nào ~. Và ~không được sử dụng như một lệnh.
derobert

Tôi thấy nó khá dễ hiểu bản thân mình, nếu không nói ra hoàn toàn. Vấn đề với CDPATHlà nó không hoạt động đối với các lệnh bên ngoài .... CD. IE bạn có thể cd ~~hoặc cd ~~/testdir1nhưng bạn không thểvim ~~testdir1
Gravy

bạn có thể làm tốt hơn với một bí danh gọi hàm. thíchalias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '
mikeerv
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.