我尝试为我在编写 shell 脚本时经常使用的路径创建一个“别名”。我尝试了一些东西,但失败了:
myFold="~/Files/Scripts/Main"
cd myFold
bash: cd: myFold: No such file or directory
我如何使它工作?
但是,cd ~/Files/Scripts/Main
有效。
由于它是一个环境变量(别名在 中具有不同的定义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
有一个外壳选项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_completion
cdable_vars
bash_completion
.bashrc
/etc/profile
其他 shell 也有类似的选项,例如 Zsh ( cdablevars
)。
也许使用链接更好
符号或软链接(文件或目录,更灵活和自我记录)
# 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
首先,您需要删除引号:
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$
您可以将所需的任何路径添加到 bash 的哈希表中:
hash -d <CustomName>=<RealPath>
现在您将能够cd ~<CustomName>
. 要将其永久添加到您的bashrc脚本中。
请注意,此哈希表旨在为 bash 提供缓存,而不需要在每次执行命令时搜索内容,因此该表将在使缓存无效的事件时被清除,例如修改$PATH
.
首先,您需要$
访问“myFold”的值以使问题中的代码正常工作:
cd "$myFold"
为了简化这一点,您在以下位置创建一个别名~/.bashrc
:
alias cdmain='cd ~/Files/Scripts/Main'
不要忘记获取.bashrc
一次以使别名在当前 bash 会话中可用:
source ~/.bashrc
现在您可以使用以下命令切换到文件夹:
cdmain
另一种选择是使用符号链接。IE:
ln -s ~/Files/Scripts/Main ~/myFold
之后,您可以对 执行操作~/myFold
,例如:
cp some_file.txt ~/myFold
这会将文件放入~/Files/Scripts/Main
. 您可以随时使用 删除符号链接rm ~/myFold
,这将保留原始目录。
我尝试的上述答案不允许自动扩展(自动完成)别名目录的子目录。
但是,如果您将要别名的目录推送到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
但也可以使用 dir 的实际别名,请尝试
myScripts="~/Files/Scripts/Main"
alias myScripts="cd $myScripts"
这样你就有了一个通用的命名约定(对于每个目录/别名对),如果你需要从当前目录复制一些东西到 myScripts,你不必考虑它。
IHTH
将以下行放入您的 myscript
set myFold = '~/Files/Scripts/Main'
在终端使用
source myscript
cd $myFold