skróty do katalogu bash


28

Kiedy piszę cd ~foo, chcę, aby bash zabrał mnie do jakiegoś katalogu foojako skrót do wpisania pełnej ścieżki do katalogu foo. i chciałbym móc cp ~foo/bar.txt ~/bar.txtskopiować plik z /foo/katalogu do katalogu domowego ... Zasadniczo chcę coś, co działa dokładnie tak ~/samo, ale gdzie określam, jaki powinien być katalog. [Jestem pewien, że powinienem jfgi, ale nie wiem co do pierdnięcia]


Zsh ma wbudowane wsparcie dla tego. Nazywa się to „ nazwanymi katalogami
Sildoreth,

Zbyt długo szukałem narzędzia do tworzenia zakładek do powłoki i wreszcie skończyło się na moim własnym (opartym na wyszukiwaniu rozmytym) rozwiązaniu, które bardziej mi się podoba niż cokolwiek innego, co widziałem wcześniej. Sprawdź tę odpowiedź: unix.stackexchange.com/a/209892/46011
Dmitry Frank

Odpowiedzi:


39

Sposób, w jaki to robiłem, to tworzenie katalogu zawierającego dowiązania symboliczne do katalogów, w których chcesz tworzyć skróty, i dodawanie tego katalogu do CDPATH. CDPATH kontroluje, gdzie cdbędzie wyszukiwać po przełączeniu katalogów, więc jeśli ten katalog dowiązań symbolicznych znajduje się w twoim CDPATH, możesz cdnatychmiast przejść do dowolnego z dowiązań symbolicznych :

mkdir ~/symlinks
ln -s /usr/bin ~/symlinks/b
export CDPATH=~/symlinks
cd b   # Switches to /usr/bin

Minusem jest to, że nie zadziała, jeśli w twoim bieżącym katalogu znajduje się katalog o nazwie „b” - który ma pierwszeństwo przed CDPATH


Zwykle nie lubię odpowiedzi, które mówią „najpierw musisz przełączyć powłoki”, ale ta dokładna funkcja istnieje w ZSH , jeśli chcesz z niej skorzystać; nazywa się to nazwanymi katalogami . Eksportujesz zmienną foo, a kiedy się do ~fooniej odwołujesz , rozwiązuje wartość $foo. Jest to szczególnie wygodne, ponieważ działa w poleceniach oprócz cd:

echo hi > /tmp/test
export t=/tmp
cat ~t/test   # Outputs "hi"

2
W jaki sposób ta funkcja ZSH różni się od wykonywania: echo hi> / tmp / test; export t = / tmp; cat $ t / test Przynajmniej na mojej maszynie to działa dobrze. Jedyną różnicą jest znak, który musisz wpisać.
Steven D

polecanie op do zsh jest słuszne. Nie tęskniłem za tą funkcją raz na 15 lat. wydaje się być czymś, o czym niektórzy ludzie mają obsesję, podczas gdy inni się tym nie przejmują. dlatego jest więcej niż jedna skorupa.

2
@Steven Jest dość podobny, ale ZSH wie, że w tym przypadku jest to nazwany katalog, więc może leczyć go szczególnie w szybkich rozszerzeniach i wbudowanych poleceniach powłoki
Michael Mrozek

[Najczęściej robiłbym to przy użyciu powłoki emacs Mx (ponieważ wtedy używam terminala), chyba wyklucza to rozwiązania ZSH] ...
Seamus

1
Dodałem go do mojego .zshrc i to zadziałało.
Seamus

10

Możesz napisać funkcję otoki cdi nazwać ją „cd” (ostatecznie funkcja wywoła builtin cd- używając builtinsłowa kluczowego). Możesz użyć znaku prefiksu, którego Bash nie rozwinie w wierszu poleceń, zanim funkcja go zobaczy, i jest mało prawdopodobne, aby pojawił się jako początkowy znak w nazwach katalogów, na przykład „:”. Chciałbyś, aby był bardziej solidny, ale oto prosty zarys:

# format: [semicolon] shortcut colon destination [semicolon] ...
export CDDATA='foo:/path/to/foo;bar:/path/to/bar;baz:/path/to/baz'

cd () {
    local dest=$1
    if [[ $dest == :* ]]
    then
        [[ $CDDATA =~ (^|;)${dest:1}:([^;]*)(;|$) ]]
        dest=${BASH_REMATCH[2]}
    fi
    if [[ -z $dest ]]
    then
        cd
    else
        builtin cd "$dest"
    fi
}

cd :bar    # pwd is now /path/to/bar

1
To naprawdę dobry pomysł
Michael Mrozek

Dzięki za tę sugestię - stworzyłem moje bardzo proste rozwiązanie: aaverin.github.io/unix/macox/2014/05/26/bash-named-folders
AAverin

7

z uderzeniem:

~foojest zarezerwowany dla katalogu domowego użytkownika foo. Nie polecam tworzenia użytkowników tylko dla tej wygody.

Możesz ułatwić sobie (lub trudniej) życie, zmieniając katalogi , ustawiając CDPATHzmienną środowiskową (sprawdź ją bash(1)).

Poza tym jedynym sposobem na rozważenie byłoby ustawienie zmiennych środowiskowych dla tych katalogów, które chcesz skrócić.

$ FOODIR=/var/lib/misc
$ cp ~/bar.txt $FOODIR

2

Zmienne Bash mogą być użyte do stworzenia systemu zakładek. Zmienne będą działać z każdym poleceniem, a bash wyświetli nazwę zmiennej. W nowszych wersjach bash, jeśli a / jest dołączony do nazwy zmiennej, ścieżkę, którą zawiera zmienna, można również uzupełnić tabulatorami.

mydir=/home/chris/dir
ls $my         # Tab completion works on variable name.
ls $mydir/     # Tab completion is equivalent to that with ls /home/chris/dir/
               # (doesn't work in older versions of bash).

Aby zachować trwałość, deklaracje zmiennych można przechowywać w pliku pochodzącym z .bashrc. Ponieważ ten plik jest skryptem bash, może zawierać deklaracje odwołujące się do innych zmiennych, takich jak aur="${HOME}/AUR"lub, które działają tylko na niektórych hostach if [[ $HOSTNAME == foo ]]; then bar=baz; fi, co jest przydatne, jeśli ponownie użyjesz plików konfiguracyjnych na wielu hostach i użytkownikach.

Poniższa funkcja bash (do dodania do .bashrc lub z niej uzyskana) umożliwia dodawanie i usuwanie zakładek z pliku zakładek. Jest dość nowy i nie ma gwarancji, że jest wolny od błędów.

bookmark_file=~/.bookmarks
source "$bookmark_file"

bm() {
usage='Usage:
bm add <name> <path>           Create a bookmark for path.
bm add <name>                  Create a bookmark for the current directory.
bm update                      Source the bookmark file.
bm remove <name>               Remove a bookmark'              

case $1 in
    add)
        local path
        if [[ $# -eq 2 ]]; then
            path=.
        elif [[ $# -eq 3 ]]; then
            if [[ -e $3 ]]; then
                path="$3"
            else
                echo "bm: ${3}: No such file or directory."
                return 1
            fi               
        else
            echo "$usage"
            return 1
        fi

        if declare | grep "^${2}=" > /dev/null; then
            echo "bm: The name $2 is in use."
            return 1
        fi
        path=$(readlink -f "$path")
        echo ${2}=\""$path"\" >> "$bookmark_file"
        eval ${2}=\""$path"\"
        return 0
        ;;
    update)
        if [[ $# -eq 1 ]]; then
            source "$bookmark_file"
            return 0
        fi
        ;;
    remove)
        if [[ $# -eq 2 ]]; then
            unset $2
            local contents=$(grep -v "^${2}=" "$bookmark_file")
            echo "$contents" > "${bookmark_file}.tmp"
            rm -f "$bookmark_file"
            mv "${bookmark_file}.tmp" "$bookmark_file"
            return 0
        fi
        ;;
esac

echo "$usage"
return 1
}

0

Jednym ze sposobów byłoby utworzenie aliasu dla cd, który zastąpi ~cpożądaną ścieżkę. Lub po prostu użyj zsh;)


2
Tak, myślałem o zrobieniu tego, na przykład alias ~ c = "cd / daten / cvs / plugin_root", ale to pomaga tylko z cd, a nazwanych katalogów można używać z każdym poleceniem.
fschmitt


0

Mam poniższą funkcję, która utworzy alias w locie,

s () {
    if [[ "x$1" != "x" ]]
    then
        alias $1="cd $PWD;pwd"
        echo "alias $1=\"cd $PWD;pwd\""
    else
        echo "Usage: s[s] <directory bookmark name>"
        return 1
    fi
}

Kiedy chcę dodać zakładkę do katalogu, po prostu piszę s dirName. Tworzy to alias podobny do alias dirName="cd /my/current/directory/;pwd". więc mogę wrócić do tego katalogu, po prostu pisząc dirName. Mam wersję, która zapisuje go również w bash_aliases. Działa to w dowolnej powłoce.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.