Как сделать «псевдоним» для длинного пути?

95

Я попытался создать «псевдоним» для пути, который я часто использую при написании сценариев оболочки. Я что-то пробовал, но не получилось:

myFold="~/Files/Scripts/Main"
cd myFold

bash: cd: myFold: No such file or directory

Как заставить его работать?
Однако cd ~/Files/Scripts/Mainработает.

Башбой
источник

Ответы:

121

Поскольку это переменная среды (псевдоним имеет другое определение bash), вам нужно оценить ее примерно так:

cd "${myFold}"

или:

cp "${myFold}/someFile" /somewhere/else

Но на самом деле мне проще, если вы просто хотите легко переключиться в этот каталог, создать настоящий псевдоним (в одном из bashфайлов запуска, например .bashrc), чтобы я мог сохранить нажатия клавиш:

alias myfold='cd ~/Files/Scripts/Main'

Тогда вы можете просто использовать (без cd):

myfold

Чтобы избавиться от определения, вы используете unalias. Следующая стенограмма показывает все это в действии:

pax> cd ; pwd ; ls -ald footy
/home/pax
drwxr-xr-x 2 pax pax 4096 Jul 28 11:00 footy

pax> footydir=/home/pax/footy ; cd "$footydir" ; pwd
/home/pax/footy

pax> cd ; pwd
/home/pax

pax> alias footy='cd /home/pax/footy' ; footy ; pwd
/home/pax/footy

pax> unalias footy ; footy
bash: footy: command not found
Paxdiablo
источник
Спасибо. Это работает. Я пробовал использовать только псевдоним myfold = '~ / some / path' и cd myfold. Выдает ошибку - такого каталога нет. Зачем ? Кроме того, можно ли «отменить назначение» псевдонима переменной?
bashboy
myfold = '~ / some / path' cd "$ myfold" Не работает. Зачем ?
bashboy
1
@bashboy, вероятно, потому что у вас нет каталога с таким именем. ~ / some / path был примером, вы должны заменить фактический путь, который хотите использовать. Я изменю его, чтобы использовать ваш пример каталога, чтобы было понятнее. Что касается того, как отменить назначение псевдонима, вы используете команду unalias. Я также обновил ответ расшифровкой, включая использование этой команды.
paxdiablo
Как бы вы сохранили этот псевдоним в разных терминальных сессиях? Когда я открываю новую вкладку и пытаюсь использовать этот псевдоним, это не работает.
goldisfine
4
@goldisfine, см. мои скобки in one of the bash startup files like .bashrc. Помещение псевдонима в подходящий файл запуска обеспечит его доступность для всех сеансов.
paxdiablo
74

Есть вариант оболочки cdable_vars:

cdable_vars
Если он установлен, предполагается, что аргумент cdвстроенной команды, не являющийся каталогом, является именем переменной, значением которой является каталог, в который нужно перейти.

Вы можете добавить это в свой .bashrc:

shopt -s cdable_vars
export myFold=$HOME/Files/Scripts/Main

Обратите внимание, что я заменил тильду на $HOME; кавычки предотвращают раскрытие тильды, и Bash будет жаловаться на отсутствие каталога ~/Files/Scripts/Main.

Теперь вы можете использовать это следующим образом:

cd myFold

Не $требуется. На самом деле в этом весь смысл - как показано в других ответах, cd "$myFold"работает без опции оболочки. cd myFoldтакже работает, если путь myFoldсодержит пробелы, кавычки не требуются.

Обычно это работает даже с автозаполнением вкладок, так как _cdфункция в bash_completionпроверяет, установлена ​​ли функция, cdable_varsно не каждая реализация делает это одинаково, поэтому вам, возможно, придется bash_completionснова исходить из вашего .bashrc(или отредактировать, /etc/profileчтобы установить параметр оболочки).


Другие оболочки имеют аналогичные параметры, например Zsh ( cdablevars).

Бенджамин В.
источник
1
Есть ли аналог этого для ZSH?
Ryan Stull
1
@RyanStull setopt cdablevarsпохоже, но я вообще не знаю zsh.
Benjamin W.
@JohnMee Я откатываю вашу правку назад, так как а) опция в zsh называется по-другому (без подчеркивания) б) вопрос с пометкой только Bash и в) я ссылаюсь на руководство по Bash. Тем не менее, я добавлю параграф, чтобы упомянуть другие оболочки.
Бенджамин В.
1
Такой отличный ответ! Большое спасибо заcdable_vars
Лукас П.
1
@Vladislav Обратите внимание, что это прерывает завершение, cdпредоставляемое bash-completing, которое использует _cdфункцию ( complete -o nospace -F _cd cd). Добавление -vк этому (для завершения по переменным) работает, но может иметь нежелательные побочные эффекты - для меня он показывает всю мою среду, когда я завершаю табуляцию.
Бенджамин В.
10

Может лучше использовать ссылки

Мягкая ссылка

Символьная или программная ссылка (файлы или каталоги, более гибкие и самодокументируемые)

#      Source                            Link
ln -s /home/jake/doc/test/2000/something /home/jake/xxx

Жесткая ссылка

Жесткая ссылка (только файлы, менее гибкие и не самодокументирующиеся)

#    Source                            Link
ln /home/jake/doc/test/2000/something /home/jake/xxx

Как создать ссылку на каталог

Подсказка : если вам не нужно видеть ссылку в своем доме, вы можете начать ее с точки. ; тогда он будет скрыт по умолчанию, тогда вы можете получить к нему доступ, как

cd ~/.myHiddelLongDirLink
Махмуд Бахнаси
источник
9

Вы можете добавить любые пути в хеш-таблицу вашего bash:

hash -d <CustomName>=<RealPath>

Теперь ты сможешь это сделать cd ~<CustomName>. Чтобы сделать его постоянным, добавьте его в свой сценарий bashrc .

Обратите внимание, что эта хеш-таблица предназначена для обеспечения кеша, чтобы bash не нуждался в поиске содержимого каждый раз при выполнении команды, поэтому эта таблица будет очищаться при событиях, которые делают кеш недействительным, например, при изменении $PATH.

Родриго Мартинс де Оливейра
источник
2
Я думаю, что он будет работать только внутри, zshно не внутри bash.
sergej
Это лучший ответ ИМХО, но это правда, что он работает zshтолько, по крайней мере, в моей системе Ubuntu.
Джон Стюарт
6

Во-первых, вам нужно удалить кавычки:

bashboy@host:~$ myFolder=~/Files/Scripts/Main

Кавычки не позволяют оболочке расширять тильду до ее особого значения - вашего $HOMEкаталога.

Затем вы можете использовать $myFolderокружающую среду , без оболочки переменной:

bashboy@host:~$ cd $myFolder
bashboy@host:~/Files/Scripts/Main$

Чтобы создать псевдоним , вам нужно определить псевдоним:

alias myfolder="cd $myFolder"

Затем вы можете рассматривать это как команду:

bashboy@host:~$ myFolder
bashboy@host:~/Files/Scripts/Main$
Дэвид В.
источник
На самом деле это не переменная среды, если вы exportэто не делаете .
Кейт Томпсон
1
@KeithThompson Хорошо, это просто переменная оболочки . Но вы не хотите экспортировать его, потому что не хотите, чтобы он мог повлиять на дочерние процессы. Вы определяете его таким образом в своем .bashrcили любом другом файле ресурсов, который вы используете, и он будет определен непосредственно в оболочке, но не в сценариях оболочки.
Дэвид В.
Я предпочитаю эти решения, потому что они работают с автозаполнением
Василис
5

Во-первых, вам нужно $получить доступ к значению myFold, чтобы код в вопросе работал:

cd "$myFold"

Чтобы упростить это, вы создаете псевдоним в ~/.bashrc:

alias cdmain='cd ~/Files/Scripts/Main'

Не забудьте указать .bashrcодин раз, чтобы псевдоним стал доступен в текущем сеансе bash:

source ~/.bashrc

Теперь вы можете перейти в папку, используя:

cdmain
hek2mgl
источник
4

Другой вариант - использовать символическую ссылку. то есть:

ln -s ~/Files/Scripts/Main ~/myFold

После этого вы можете выполнять такие операции ~/myFold, как:

cp some_file.txt ~/myFold

который поместит файл в формат ~/Files/Scripts/Main. Вы можете удалить символическую ссылку в любое время с помощью rm ~/myFold, что сохранит исходный каталог.

dvj
источник
Один недостаток: если вы cd myFoldтогда pwd, он покажет, что вы находитесь в myFold. Для меня это нарушает правила, потому что относительные команды с системой управления версиями p4 зависят от текущего каталога.
User5910
1
@ User5910 - использованиеpwd -P
dvj
2

но фактический псевдоним для каталога также возможен, попробуйте

 myScripts="~/Files/Scripts/Main"
 alias myScripts="cd $myScripts"

Таким образом, у вас есть общее соглашение об именах (для каждой пары dir / alias), и если вам нужно скопировать что-то из текущего каталога в myScripts, вам не нужно об этом думать.

IHTH

снаряд
источник
1

Предыдущие ответы, которые я пробовал, не допускают автоматического расширения (автозаполнения) подкаталогов каталога с псевдонимом.

Однако, если вы поместите каталог, которому хотите присвоить псевдоним, в dirsстек ...

$ pushd ~/my/aliased/dir

... затем вы можете ввести, dirs -vчтобы увидеть его числовую позицию в стеке:

 0  ~/my/aliased/dir
 1  ~/Downloads
 2  /media/usbdrive

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

 $ mv foo.txt ~0  

Вы даже можете использовать, Tabчтобы показать непосредственные подкаталоги каталога с псевдонимом:

 $ cd ~0/<Tab>
 child_dir1    child_dir2
chb
источник
-1

Поместите следующую строку в свой myscript

set myFold = '~/Files/Scripts/Main'

В терминале используйте

source myscript
cd $myFold
Чаян Патхак
источник