Tương đương của bí danh cho một liên kết tượng trưng?


18

Tôi thấy mình cần phải nhảy xung quanh một vài thư mục trong thư mục nhà của tôi và cảm thấy mệt mỏi khi viết chúng. Tôi muốn một cách tiếp cận nhanh hơn, theo truyền thống sẽ là một liên kết tượng trưng.

Tuy nhiên, tôi không muốn làm lộn xộn thư mục nhà của mình với hàng tá các liên kết tượng trưng. Tôi có thể tạo một số ~/links/thư mục và làm lộn xộn với các liên kết tượng trưng, ​​nhưng nó vẫn xấu. Ngoài ra, tôi có thể muốn tạo các liên kết tượng trưng thay đổi mỗi ngày (được xác định trong .bashrc) để chuyển đến thư mục ngày hiện tại.

Có cách nào để bí danh hiệu quả một liên kết tượng trưng, ​​tạo ra thứ gì đó sẽ được công nhận là liên kết để điều hướng nhanh, nhưng thực sự sẽ không xuất hiện khi tôi thực hiện một lsthư mục nhà của mình và sẽ không tồn tại sau phiên hiện tại?


4
bạn có thể muốn xem xét về Pushd và popd
Rui F Ribeiro

tôi thấy cách tiếp cận của Jeroen Janssen có thể thích ứng và chi phí thấp cho nhu cầu chính xác này: jeroenjanssens.com/2013/08/16/ mẹo
Theophrastus

2
Bạn đang sử dụng vỏ gì?
Gilles 'SO- ngừng trở nên xấu xa'

@Theophrastus Heh - về cơ bản, những gì tôi thực hiện lại không hoàn toàn thanh lịch trong câu trả lời của tôi.
mattdm

3
không chính xác những gì bạn đang tìm kiếm, nhưng vẫn có thể có ích khi nhảy qua lại giữa hai đạo diễn: cd -sẽ cdvào thư mục cuối cùng trước đó. Do đó, nếu bạn làm điều đó hai lần, bạn sẽ quay lại nơi bạn đã bắt đầu ... rất tốt cho tình huống "ồ tôi quên chỉnh sửa someFile.txt tại vị trí trước đó" => Đơn giản cd -:, chỉnh sửa someFile.txtcd -
dingalapadum

Câu trả lời:


12

Bạn có thể sử dụng hoàn thành tab. Theo mặc định trên nhiều bản phân phối Linux, bash được thiết lập để khi bạn nhấn phím [TAB], bạn sẽ được cung cấp một danh sách các kết quả khớp có thể hoặc nếu chỉ có một trận đấu, tất cả sẽ được điền. Đối với cd, đây thường là một danh sách các thư mục con của thư mục làm việc hiện tại. Bạn có thể ghi đè lên điều đó, nhưng tôi đề nghị thay vì tạo bí danh, như jdcho "thư mục nhảy":

alias jd=cd

và sau đó, xác định "dấu trang" bạn muốn là hoàn thành cho jd. Nhìn vào trang bash man để biết thêm nhiều tùy chọn (bao gồm tự động tạo kết quả khi đang di chuyển từ một lệnh hoặc chức năng), nhưng cách dễ nhất chỉ là một danh sách các từ, với -W:

hoàn thành -W "/ srv / www ~ / tmp ~ / work" jd

Bây giờ, nhập jdvà nhấn [TAB] và bạn sẽ thấy "dấu trang" của mình. Nhập bất kỳ phần mơ hồ nào, sau đó nhấn [TAB] để hoàn thành. (Trong phần trên, phần ~mở rộng vào thư mục chính của tôi, vì vậy [TAB] đầu tiên cung cấp cho tôi /và nếu tôi nhấn wvà [TAB] lần nữa, /srv/wwwsẽ được điền vào.)

Tất nhiên, đặt điều này vào ~/.bash_profileđể làm cho nó tồn tại.

Hoặc, chúng ta có thể đưa nó lên cấp độ tiếp theo. Tạo một thư mục ~/.shortcuts- bắt đầu bằng một dấu chấm, nó sẽ bị ẩn đi và không làm hỏng thư mục nhà sạch đẹp của bạn - và điền vào đó bằng các liên kết tượng trưng đến các thư mục bạn muốn. Sau đó, đặt cái này vào ~ / .bash_profile của bạn:

_list_shortcuts() 
{ 
    COMPREPLY=($( compgen -W "$( ls ~/.shortcuts )" -- ${COMP_WORDS[COMP_CWORD]} ))
}
jd()
{
    cd -P ~/.shortcuts/$1
}
complete -F _list_shortcuts jd

Điều này xác định một sự hoàn thành phức tạp hơn một chút trong phiên bản _list_shortcutsđể xây dựng danh sách các tên và biến nó jdthành một hàm chứ không phải là một bí danh đơn giản, vì chúng ta muốn nó hoạt động khác với chỉ cd. Các -Plá cờ để cdlàm cho nó giải quyết liên kết tượng trưng, vì vậy tất cả mọi thứ trở nên trong suốt kỳ diệu. Tên phím tắt của bạn thậm chí không phải phù hợp với các mục tiêu.

Vì thế:

$ ls -l ~/.shortcuts/
total 0
lrwxrwxrwx. 1 mattdm mattdm 16 Dec 17 19:44 tmp -> /home/mattdm/tmp
lrwxrwxrwx. 1 mattdm mattdm 17 Dec 17 19:44 WORK -> /home/mattdm/work
lrwxrwxrwx. 1 mattdm mattdm  8 Dec 17 19:44 www -> /srv/www
$ jd tmp
$ pwd
/home/mattdm/tmp
$ jd WORK
/home/mattdm/work

Và, để có thêm một liều ưa thích, hãy lập jddanh sách tất cả các phím tắt của bạn khi được thực hiện mà không có bất kỳ tham số nào:

jd()
{
    if [[ -z "$1" ]]; then
      (cd ~/.shortcuts; stat -c '%N' *)
    else
      cd -P ~/.shortcuts/$1
    fi
}

Lưu ý: Tôi sử dụng compgen -W $( cmd )thay compgen -C 'cmd'vì bởi vì cái sau không bao giờ làm việc cho tôi và tôi không hiểu tại sao. Đó có thể là một câu hỏi mới của riêng tôi. :)


rất thú vị. Mặc dù vậy, nó vẫn yêu cầu nhập liên kết đầy đủ hoặc ít nhất là đủ liên kết để trở nên không mơ hồ, trước khi tôi có thể hoàn thành với jd. Bất kỳ cách nào để thêm bí danh vào các lệnh jd để rút ngắn chúng? hoặc làm cho chúng liên quan đến một thư mục nơi tôi có thể lưu trữ các liên kết tượng trưng mà tôi cho là.
dsollen

@dsollen Xem cập nhật :)
mattdm

Điều này làm việc hoàn hảo. Thành thật mà nói tôi không mong đợi một câu trả lời hay cho câu hỏi này, nhưng đây chính xác là những gì tôi muốn. Tôi dự đoán khá nhiều về việc sử dụng này và cảm thấy đủ sạch để thêm vào danh sách những thứ tôi sửa đổi bất cứ khi nào tôi nhận được một VM mới (tôi thậm chí có một cách tự động để sao chép các thay đổi môi trường tiêu chuẩn của tôi sang vm lol mới). Cảm ơn rất nhiều. Tại một số thời điểm khi tôi có nhiều thời gian rảnh hơn, tôi sẽ tìm ra cách cú pháp cho
TÍNH TOÁN

18

Các bí danh Shell có tính năng mà bạn có thể thực hiện (một số) hoàn thành tên trên chúng (thường bị ràng buộc tab). Ngoài ra, bạn có thể sử dụng CDPATHtính năng "gần đây" (trong vòng 5-6 năm qua) đã được cải thiện để hỗ trợ hoàn thành tên. Nếu điều đó làm việc cho bạn, nó có lợi thế là những gì bạn gõ là tên thực của thư mục chứ không phải là một ký hiệu cho nó.

Theo hướng dẫn sử dụng bash

CDPATH
Một danh sách các thư mục được phân tách bằng dấu hai chấm được sử dụng làm đường dẫn tìm kiếm cho cdlệnh dựng sẵn.

Đọc thêm:


Không biết về CDPATHbiến môi trường, cảm ơn bạn. Tôi có thể thêm git_reposthư mục của mình vào biến đó ....
Wildcard

16

Đối với các thư mục bạn thường xuyên sử dụng, nhưng không thay đổi hàng ngày, một tùy chọn khác là chỉ có một số aliaslệnh trong .bashrctệp của bạn :

alias cdo="cd /u01/app/oracle"
alias cdw="cd /var/www/html" 

Một người bạn có khoảng 50 người trong số đó; Tôi có một số ít; nhanh chóng và dễ dàng Chỉ

cdo

để thay đổi thư mục thành / u01 / app / oracle


Thật. Tôi đã sử dụng cơ chế này từ đầu những năm 1990.
wallyk

7

Tôi đề nghị pushdpopd.

Cá nhân tôi thấy chúng tiện dụng khi thực hiện công việc phát triển / đọc mã nguồn, khi có nhiều thư mục tham gia.

Chúng thực hiện một cách hiệu quả cấu trúc ngăn xếp / LIFO, trong đó bạn PUSH một thư mục ( pushd) và lệnh thư mục POP tiếp theo ( popd) lấy nó.

Vì vậy, khi bên trong một thư mục, bạn sẽ làm:

pushd .

Và khi bạn cần lấy nó, bạn làm

popd

Bạn có thể thực hiện nhiều pushd(các) và thực hiện các popd(các) tương ứng sau này để quay lại các thư mục.

Tôi sẽ để lại ở đây một liên kết.

http://www.eriwen.com/bash/pushd-and-popd/


1
Đây cũng là giải pháp tôi sử dụng, ngoại trừ tôi không sử dụng popdnhiều. Tôi điền vào dirsdanh sách của mình (được điền bởi pushdcác lệnh) với tất cả các thư mục tôi muốn truy cập / làm việc trong khoảng thời gian đó, sau đó tôi chạy pushd +1. Sau đó, tôi có thể chuyển qua các thư mục một cách đơn giản !pu, rất nhanh. (Lưu ý rằng trên cả Ubuntu và CentOS, pushdlà lệnh duy nhất có sẵn trên bản cài đặt sạch bắt đầu bằng pu.)
Wildcard

3

Bạn chỉ có thể đặt chúng làm biến trong bạn ~/.bashrc, và sau đó chúng chỉ là một $biến mất.

$ cat ~/.bashrc
if [ "$PS1" ]
then
    export myproj=~/todays/fancy/project
fi

$ cd $myproj

3

Câu trả lời rõ ràng là các biến , những thứ tượng trưng trong vỏ đại diện cho những thứ khác, tương tự như các liên kết tượng trưng trong hệ thống tập tin.

path/to/project $ project=$PWD
path/to/project $ cd $elsewhere   # Previously created
path/to/elsewhere $ cd $project
path/to/project $ logout          # Variables gone, as required

Trong bất kỳ shell nào, bạn sẽ Tabhoàn thành các tên biến giúp ích thêm.

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.