ярлыки каталога 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 от: echo hi> / tmp / test; export t = / tmp; cat $ t / test По крайней мере, на моей машине это работает просто отлично. Разница лишь в том, что вы должны печатать.
Стивен Д
обращение оп к zsh - правильная вещь. я не пропустил эту функцию раз в 15 лет. Кажется, что некоторые люди действительно зациклены, а другим нет до этого дела. Вот почему существует более одной оболочки.
2
@Steven Это очень похоже, но ZSH знает, что это именованный каталог в этом случае, поэтому он может обращаться с ним особенно в быстрых расширениях и встроенных командах оболочки
Майкл Мрозек
[Я бы в основном делал это, используя оболочку emacs Mx (поскольку именно тогда я использую терминал), я думаю, это исключает решения ZSH] ...
Seamus
1
Добавил его в мой .zshrc и это сработало.
Симус
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

с баш:

~fooзарезервировано для домашнего каталога пользователя foo. Я бы не рекомендовал создавать пользователей только для этого.

Сменив каталоги, вы можете упростить (или усложнить) свою жизнь , установив CDPATHпеременную среды (см. В bash(1)).

Кроме того, единственный способ подумать - установить переменные окружения для тех каталогов, которые вы хотите сократить.

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

источник
2

Переменные Bash могут быть использованы для создания системы закладок. Переменные будут работать с любой командой, а bash завершит имя переменной. В более новых версиях bash, если / добавляется к имени переменной, путь, который содержит переменная, также может быть дополнен табуляцией.

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
}
varactyl
источник
0

Можно было бы создать псевдоним для компакт-диска, который заменяет ~cнужный путь. Или просто используйте Zsh;)

Крисси
источник
2
Да, я думал об этом, как псевдоним ~ c = "cd / daten / cvs / plugin_root", но это помогает только с cd, тогда как именованные каталоги могут использоваться с каждой командой.
fschmitt
0

Для смены каталогов вы можете использовать wcd: Wherever Change Directory

С этим все будет как wcd plugin_root.

Алекс
источник
Я хотел что-то, что работает с командами, кроме cdкак ...
Симус
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. Это работает в любой оболочке.

Балки
источник