Як зробити “псевдонім” для довгого шляху?


94

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

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

bash: cd: myFold: No such file or directory

Як змусити це працювати?
Однак cd ~/Files/Scripts/Mainпрацює.

Відповіді:


119

Оскільки це змінна середовища (псевдонім має інше визначення в 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

Дякую. Це працює. Я спробував лише псевдонім 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; лапки запобігають розширенню тильди, і Баш скаржиться на відсутність каталогу ~/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.
Бенджамін В.

@JohnMee Я відкачу вашу редакцію назад, оскільки а) опція називається по-різному в zsh (без підкреслення) б) питання, позначене просто Bash і c) я посилаюся на керівництво Bash. Однак я додам абзац, щоб згадати інші оболонки.
Бенджамін В.

1
Така чудова відповідь! Щиро дякую заcdable_vars
Лукас П.

1
@Vladislav Зверніть увагу, що це перериває завершення, cdзабезпечуючи bash-завершення, яке використовує _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

Це найкраща відповідь IMHO, але це правда, що він працює 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або будь-якому іншому файлі ресурсів, який ви використовуєте, і він буде визначений у безпосередній оболонці, але не в сценаріях оболонки.
Девід В.

Я віддаю перевагу цим рішенням, тому що вони працюють з автозавершенням
Vassilis

5

По-перше, вам потрібен $доступ до значення "myFold", щоб змусити код у запитанні працювати:

cd "$myFold"

Щоб спростити це, ви створюєте псевдонім у ~/.bashrc:

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

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

source ~/.bashrc

Тепер ви можете перейти до папки за допомогою:

cdmain

4

Іншим варіантом буде використання символічного посилання. тобто:

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

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

cp some_file.txt ~/myFold

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


Один недолік: якщо ви cd myFoldпотім pwd, це покаже ти в myFold. Для мене це угода, оскільки відносні команди з керуванням джерелом p4 залежать від поточного каталогу.
User5910

1
@ User5910 - usepwd -P
dvj

2

але реальний псевдонім для директиви також можливий, спробуйте

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

Таким чином у вас є загальна умова іменування (для кожної пари директорій / псевдонімів), і якщо вам потрібно скопіювати щось із поточного каталогу в 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

-1

Помістіть наступний рядок у свій скрипт

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

У терміналі використовують

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