ярлики каталогу bash


29

Коли я набираю текст cd ~foo, я б хотів, щоб bash переніс мене в деякий каталог fooяк ярлик для введення повного шляху до каталогу foo. і я хотів би мати можливість cp ~foo/bar.txt ~/bar.txtскопіювати файл із /foo/каталогу в домашній каталог ... Отже, я хочу, щоб я працював так, як ~/працює, але де я вказую, яким повинен бути каталог. [Я впевнений, що я повинен jfgi, але я не знаю, що робити fg]


zsh має вбудовану підтримку для цього. Це називається " названі каталоги "
Sildoreth

Я занадто довго шукав інструмент для закладки оболонок, і, нарешті, закінчився власним рішенням (нечіткого пошуку), яке мені подобається набагато більше, ніж усе, що я бачив раніше. Перевірте цю відповідь: unix.stackexchange.com/a/209892/46011
Дмитро Френк

Відповіді:


40

Я використовував це для створення каталогу, який містить символьні посилання на каталоги, до яких потрібно зробити ярлики, і додати цей каталог до своєї CDPATH. CDPATH контролює, де cdбуде здійснюватися пошук при переключенні каталогів, тож якщо цей каталог символьних посилань знаходиться у вашому CDPATH, ви можете cdмиттєво перейти до будь-якого із каталогів, що мають посилання :

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

Мінус, звичайно, не спрацює, якщо у вашому поточному каталозі є ім'я "b" - який має перевагу над CDPATH


Я, як правило, не люблю відповіді, які говорять "спочатку вам потрібно переключити оболонки", але ця точна функція існує в ZSH , якщо ви готові використовувати це замість цього; її називають іменованими каталогами . Ви експортуєте змінну foo, і коли ви посилаєтесь на ~fooнеї, вона відповідає значенню $foo. Це особливо зручно, оскільки воно працює в командах, окрім cd:

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

2
Чому ця функція ZSH відрізняється від виконання: ехо привіт> / tmp / тест; експорт t = / tmp; cat $ t / тест Принаймні на моїй машині це працює чудово. Єдина відмінність - це символ, який потрібно ввести.
Стівен Д

посилання оп на zsh - це правильно зробити. Я не пропустив цю функцію раз у 15 років. здається, що таке, про яке люди дійсно одержимі, а іншим все одно. ось чому є більше оболонки.

2
@Steven Це досить схоже, але ZSH знає, що в цьому випадку це названий каталог, тому він може обробляти його спеціально в оперативних розширеннях і вбудованих командах оболонок
Michael Mrozek

[Я б здебільшого робив це за допомогою оболонки Emacs Mx (оскільки саме тоді я використовую термінал), я думаю, це виключає рішення ZSH] ...
Seamus

1
Додав його до мого .zshrc, і це спрацювало.
Seamus

10

Ви можете написати функцію обгортки для cdі назвати її "cd" (зрештою, функція зателефонує builtin cd- за допомогою builtinключового слова). Ви можете використовувати символ префікса, який Bash не розширюватиме в командному рядку до того, як ваша функція побачить це, і це навряд чи відображатиметься як початковий символ у назвах вашого каталогу, можливо ":". Ви хочете зробити це більш надійним, але ось простий контур:

# 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
Це дійсно гарна ідея
Майкл Мрозек

Дякую за цю пропозицію - я зробив над собою своє дійсно просте рішення: aaverin.github.io/unix/macox/2014/05/26/bash-named-folders
AAverin

7

з bash:

~fooзарезервовано для домашнього каталогу foo користувача. Я б не рекомендував створювати користувачів саме для цієї зручності.

Ви можете полегшити своє життя (або важче) при зміні каталогів , встановивши CDPATHзмінну середовища (перегляньте її в bash(1)).

Крім цього, єдиним способом думати було б встановити змінні середовища для тих каталогів, які ви хочете скоротити.

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

2

Змінні Bash можна використовувати для створення системи закладки. Змінні будуть працювати з будь-якою командою, а bash завершить ім'я змінної. У новіших версіях bash, якщо a / додається до імені змінної, шлях, який містить змінна, може бути також вкладений табуляцією.

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).

Для постійності змінні декларації можна зберігати у файлі, який походить з .bashrc. Оскільки цей файл є bash-скриптом, він може містити декларації, що посилаються на інші змінні, наприклад aur="${HOME}/AUR", або які працюють лише на певних хостах if [[ $HOSTNAME == foo ]]; then bar=baz; fi, що корисно, якщо ви повторно використовуєте конфігураційні файли для декількох хостів та користувачів.

Наступна функція bash (яку потрібно додати до .bashrc або отримувати з неї) дозволяє додавати закладки до файлу закладок і видаляти їх із них. Він є досить новим і не гарантовано позбавлений помилок.

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

Способом було б створення псевдоніму для CD, який заміняє ~cпотрібний шлях. Або просто використовувати zsh;)


2
Так, я думав про це, як alias ~ c = "cd / daten / cvs / plugin_root", але це допомагає лише з cd, тоді як названі каталоги можна використовувати з кожною командою.
fschmitt

0

Для зміни каталогів ви можете використовувати wcd: Де каталог

З цим воно буде як wcd plugin_root.


Я хотів щось, що працює з іншими командами, окрім cdяк ...
Seamus,

0

У мене нижче функція, яка створюватиме псевдонім на льоту,

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
}

Коли я хочу зробити закладку в каталозі, я просто наберіть s dirName. Це створює псевдонім на кшталт alias dirName="cd /my/current/directory/;pwd". тож я можу повернутися до цього каталогу, просто набравши текст dirName. У мене є версія, яка зберігає його також у bash_aliases. Це працює в будь-якій оболонці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.