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?
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?
Câu trả lời:
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/passwd
tập tin của bạn :
~:x:1111:99:special Character user:/test:/sbin/nologin
thay thế 1111
UID bằng một cái gì đó có ý nghĩa, thay thế /test
bằng thư mục bạn muốn ~ ~ để bắt chước.
99
trên hệ thống của tôi là nobody
nhó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/nologin
vỏ như vậy, nó không thể được sử dụng, nó cũng sẽ không có /etc/shadow
mụ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 tmp
và sau đó sửa đổi /etc/passwd
và /etc/shadow
thay đổi người dùng tmp
thành ~
và thay đổi vị trí củahome directory
useradd 'tmp'
thay thế tmp
bằng~
shadow
mụ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.
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 ~~/someFile
từ 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ư ~/b
hoặ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.
~
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 $HOME
biế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 $HOME
tấ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ó. $HOME
chỉ 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 $CDPATH
nội tuyến mà không thay đổi giá trị shell hiện $CDPATH
tại. Ví dụ:
mkdir -p /tmp/1/2
CDPATH=/tmp cd 1/2
/tmp/1/2
cd
nhấ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ị $CDPATH
khô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 cd
lệ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 cd
lệ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
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
cd ~~/foo/bar
sẽ không hoạt động tốt như vậy, hay vim ~~/foo.txt
, v.v ...
CDPATH
biến để xử lý cd
trường hợp.
~
. Và ~
không được sử dụng như một lệnh.
CDPATH
là 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 ~~/testdir1
nhưng bạn không thểvim ~~testdir1
alias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '