Горячие клавиши bash

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

26 голосов | спросил Seamus 1 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 01 Sep 2010 20:10:15 +0400 2010, 20:10:15

7 ответов


34

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

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

Конечно, это не работает, если в вашем текущем каталоге с именем «b» есть каталог, который имеет приоритет над CDPATH


Мне обычно не нравятся ответы, которые говорят «сначала вам нужно переключать оболочки», но эта функция exact существует в ZSH , если вы захотите использовать это вместо этого; он называется названными каталогами . Вы экспортируете переменную foo, а когда вы обратитесь к ~foo он разрешает значение $foo. Это особенно удобно, потому что он работает в командах помимо cd:

echo hi > /tmp/test
export t=/tmp
cat ~t/test   # Outputs "hi"
ответил Michael Mrozek 1 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 01 Sep 2010 20:28:07 +0400 2010, 20:28:07
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
ответил Dennis Williamson 1 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 01 Sep 2010 23:48:36 +0400 2010, 23:48:36
6

с bash:

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

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

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

$ FOODIR=/var/lib/misc
$ cp ~/bar.txt $FOODIR
ответил 1 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 01 Sep 2010 20:20:49 +0400 2010, 20:20:49
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" или только на определенных хостах ---- +: = 2 =: + ----, что полезно при повторном использовании конфигурационных файлов для нескольких хостов и пользователей.

Следующая функция bash (которая будет добавлена ​​в .bashrc или получена из нее) позволяет добавлять и удалять закладки из файла закладок. Он довольно новый и не гарантированно свободен от ошибок.

if [[ $HOSTNAME == foo ]]; then bar=baz; fi
ответил varactyl 3 J000000Thursday14 2014, 01:03:26
0

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

ответил krissi 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 22 Sep 2010 14:30:06 +0400 2010, 14:30:06
0

Для изменения каталогов вы можете использовать wcd: везде, где каталог изменений

С этим он будет похож на wcd plugin_root.

ответил alex 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 22 Sep 2010 15:46:05 +0400 2010, 15:46:05
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. Это работает в любой оболочке.

ответил balki 11 52011vEurope/Moscow11bEurope/MoscowFri, 11 Nov 2011 13:32:22 +0400 2011, 13:32:22

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132