115

我尝试为我在编写 shell 脚本时经常使用的路径创建一个“别名”。我尝试了一些东西,但失败了:

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

bash: cd: myFold: No such file or directory

我如何使它工作?
但是,cd ~/Files/Scripts/Main有效。

4

10 回答 10

126

由于它是一个环境变量(别名在 中具有不同的定义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
于 2013-07-30T22:37:08.177 回答
90

有一个外壳选项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"没有 shell 选项的情况下也可以工作。cd myFold如果路径中myFold包含空格,也可以使用,不需要引用。

这通常甚至适用于选项卡自动完成作为检查是否设置的_cd功能- 但并非每个实现都以相同的方式执行它,因此您可能必须在您的(或编辑以设置 shell 选项)中再次获取源。bash_completioncdable_varsbash_completion.bashrc/etc/profile


其他 shell 也有类似的选项,例如 Zsh ( cdablevars)。

于 2016-10-03T19:51:42.690 回答
16

也许使用链接更好

软链接

符号或软链接(文件或目录,更灵活和自我记录)

#      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
于 2018-11-06T21:33:44.960 回答
12

首先,您需要删除引号:

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

引号可防止 shell 将波浪号扩展到其作为您的$HOME目录的特殊含义。

然后,您可以使用$myFolder环境shell 变量:

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

要创建别名,您需要定义别名:

alias myfolder="cd $myFolder"

然后,您可以将此类视为命令:

bashboy@host:~$ myFolder
bashboy@host:~/Files/Scripts/Main$
于 2013-07-31T03:14:21.503 回答
11

您可以将所需的任何路径添加到 bash 的哈希表中:

hash -d <CustomName>=<RealPath>

现在您将能够cd ~<CustomName>. 要将其永久添加到您的bashrc脚本中。

请注意,此哈希表旨在为 bash 提供缓存,而不需要在每次执行命令时搜索内容,因此该表将在使缓存无效的事件时被清除,例如修改$PATH.

于 2016-10-03T19:23:56.260 回答
5

首先,您需要$访问“myFold”的值以使问题中的代码正常工作:

cd "$myFold"

为了简化这一点,您在以下位置创建一个别名~/.bashrc

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

不要忘记获取.bashrc一次以使别名在当前 bash 会话中可用:

source ~/.bashrc

现在您可以使用以下命令切换到文件夹:

cdmain
于 2013-07-30T22:30:55.357 回答
5

另一种选择是使用符号链接。IE:

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

之后,您可以对 执行操作~/myFold,例如:

cp some_file.txt ~/myFold

这会将文件放入~/Files/Scripts/Main. 您可以随时使用 删除符号链接rm ~/myFold,这将保留原始目录。

于 2017-12-05T21:42:00.067 回答
3

我尝试的上述答案不允许自动扩展(自动完成)别名目录的子目录。

但是,如果您将要别名的目录推送到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
于 2019-10-07T06:00:53.427 回答
2

但也可以使用 dir 的实际别名,请尝试

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

这样你就有了一个通用的命名约定(对于每个目录/别名对),如果你需要从当前目录复制一些东西到 myScripts,你不必考虑它。

IHTH

于 2013-07-30T22:36:48.187 回答
-1

将以下行放入您的 myscript

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

在终端使用

source myscript
cd $myFold
于 2019-06-11T09:23:42.457 回答