如何为长路径制作"别名"?

bas*_*boy 79 unix linux bash scripting

我试图为shell脚本经常使用的路径制作一个"别名".我试了一下,但失败了:

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

bash: cd: myFold: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我如何使其工作?
但是,cd ~/Files/Scripts/Main工作.

pax*_*blo 103

由于它是一个环境变量(别名具有不同的定义bash),您需要使用以下内容对其进行评估:

cd "${myFold}"
Run Code Online (Sandbox Code Playgroud)

要么:

cp "${myFold}/someFile" /somewhere/else
Run Code Online (Sandbox Code Playgroud)

但实际上我发现它更容易,如果你只是想轻松切换到该目录,创建一个真正的别名(在其中一个bash启动文件中.bashrc),所以我可以保存击键:

alias myfold='cd ~/Files/Scripts/Main'
Run Code Online (Sandbox Code Playgroud)

然后你可以使用(没有cd):

myfold
Run Code Online (Sandbox Code Playgroud)

要删除定义,请使用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
Run Code Online (Sandbox Code Playgroud)

  • @goldisfine,在其中一个bash启动文件中查看我的括号`,如.bashrc`.将别名放入合适的启动文件将确保它可用于*all*会话. (3认同)

Ben*_* W. 52

有一个shell选项cdable_vars:

cdable_vars
如果设置了此参数,cd则假定内核命令不是目录的参数是变量的名称,该变量的值是要更改的目录.

您可以将此添加到您的.bashrc:

shopt -s cdable_vars
export myFold=$HOME/Files/Scripts/Main
Run Code Online (Sandbox Code Playgroud)

请注意,我已将波浪号替换为$HOME; 引号阻止波浪扩展,Bash会抱怨没有目录~/Files/Scripts/Main.

现在你可以使用如下:

cd myFold
Run Code Online (Sandbox Code Playgroud)

不需要$.这就是重点,实际上 - 如其他答案所示,cd "$myFold"没有shell选项.cd myFold如果路径myFold包含空格,则不起作用,也不需要引用.

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


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

  • @RyanStull `setopt cdablevars` 看起来可能是这样,但我根本不知道 zsh。 (3认同)
  • ZSH 是否有类似的东西? (2认同)

小智 8

也许最好使用链接

软链接

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

#      Source                            Link
ln -s /home/jake/doc/test/2000/something /home/jake/xxx
Run Code Online (Sandbox Code Playgroud)

硬链接

硬链接(仅文件,灵活性较差且无法自我记录)

#    Source                            Link
ln /home/jake/doc/test/2000/something /home/jake/xxx
Run Code Online (Sandbox Code Playgroud)

如何创建目录链接

提示:如果您不需要在家里看到链接,则可以以一个点开头。; 那么默认情况下它将被隐藏,然后您可以像访问它

cd ~/.myHiddelLongDirLink
Run Code Online (Sandbox Code Playgroud)


Rod*_*ins 7

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

hash -d <CustomName>=<RealPath>

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

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

  • 我认为它只适用于“zsh”,但不适用于“bash”。 (2认同)

hek*_*mgl 5

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

cd "$myFold"
Run Code Online (Sandbox Code Playgroud)

要简化此操作,请在~/.bashrc以下位置创建别名:

alias cdmain='cd ~/Files/Scripts/Main'
Run Code Online (Sandbox Code Playgroud)

不要忘记使用.bashrc一次来使别名在当前的bash会话中变为可用:

source ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

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

cdmain
Run Code Online (Sandbox Code Playgroud)


Dav*_* W. 5

首先,您需要删除引号:

bashboy@host:~$ myFolder=~/Files/Scripts/Main
Run Code Online (Sandbox Code Playgroud)

引号阻止shell将波浪号扩展为其作为$HOME目录的特殊含义.

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

bashboy@host:~$ cd $myFolder
bashboy@host:~/Files/Scripts/Main$
Run Code Online (Sandbox Code Playgroud)

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

alias myfolder="cd $myFolder"
Run Code Online (Sandbox Code Playgroud)

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

bashboy@host:~$ myFolder
bashboy@host:~/Files/Scripts/Main$
Run Code Online (Sandbox Code Playgroud)

  • @KeithThompson 好的,它只是一个 _shell 变量_。但是,您不想导出它,因为您不希望它可能影响子进程。你在你的 `.bashrc` 或任何你使用的资源文件中以这种方式定义它,它将在直接 shell 中定义,而不是在 shell 脚本中定义。 (2认同)

dvj*_*dvj 5

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

ln -s ~/Files/Scripts/Main ~/myFold
Run Code Online (Sandbox Code Playgroud)

之后就可以对 进行操作~/myFold,例如:

cp some_file.txt ~/myFold
Run Code Online (Sandbox Code Playgroud)

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