我试图为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
谢谢。这样可行。我只尝试了别名myfold ='?/ some / path'和cd myfold。我收到一个错误 - 没有这样的目录。为什么?此外,是否可以"取消分配"别名变量?
myfold ='?/ some / path'cd"$ myfold"失败。为什么?
@bashboy,可能是因为你没有这个名字的目录。 ?/ some / path就是一个例子,你应该替换你想要使用的实际路径。我将更改它以使用您的示例目录,以便更清楚。至于如何取消分配别名,请使用unalias命令。我还用成绩单更新了答案,包括使用该命令。
您将如何在不同的终端会话中保留此别名?当我打开一个新选项卡并尝试使用此别名时,它不起作用。
@goldisfine,请参阅我的括号in one of the bash startup files like .bashrc。将别名放入合适的启动文件将确保它可用于所有会话。
我不认为这回答了这个问题;它仅针对cd。如果用户想要mv sourcedir/filename reallylongpath怎么办?
@Will,我想你会发现第一段已经涵盖了这一点。我会澄清一下。
有一个shell选项cdable_vars:
cdable_vars
If this is set, an argument to the cd builtin
command that is not a directory is assumed to be the name of a
variable whose value is the directory to change to.
您可以将其添加到.bashrc:
shopt -s cdable_vars
export myFold=$HOME/Files/Scripts/Main
请注意,我用$HOME替换了波形符;引号阻止波浪扩展,Bash会抱怨没有目录~/Files/Scripts/Main。
现在你可以使用如下:
cd myFold
不需要$。这就是重点,实际上如其他答案所示,cd"$myFold"没有shell选项。如果myFold中的路径包含空格,则无法引用,cd myFold也可以使用。
这通常甚至适用于选项卡自动完成,因为bash_completion中的_cd函数检查是否设置了cdable_vars但是并非每个实现都以相同的方式执行它,因此您可能必须在.bashrc中再次获取bash_completion (或编辑/etc/profile以设置shell选项)。
其他shell具有类似的选项,例如Zsh(cdablevars)。
ZSH有相同的这个吗?
@RyanStull setopt cdablevars看起来可能是,但我根本不知道zsh。
@JohnMee我将回滚你的编辑,因为a)zsh中的选项被调用(没有下划线)b)标记为Bash的问题和c)我链接到Bash手册。不过,我会添加一个段落来提及其他炮弹。
@JohnMee我找不到csh或tcsh的选项,它叫什么?
这么好的答案!非常感谢cdable_vars
但cdable_vars并没有让我能够执行其他命令,例如ls
@MuhammadYusuf你是什么意思?你想做什么?
@BenjaminW。我想拥有一个目录的别名,这样我就可以cd,ls,mkdir ......以及所有需要的操作,但cdable_vars只能让我能够进入别名目录
@MuhammadYusuf是的,它只是cd的别名。我不确定你在Bash中寻找的那种全局别名是否可行。
也许最好使用链接
软链接
符号或软链接(文件或目录,更灵活和自我记录)
# 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
您可以将所需的任何路径添加到bash的哈希表中:
hash -d =
现在你将能够cd ~。要使其永久添加到您的bashrc脚本。
请注意,此哈希表旨在为每次执行命令时不需要搜索内容的bash提供缓存,因此该表将在使缓存无效的事件上清除,例如,修改$PATH。
这应该是正确的答案。
首先,您需要删除引号:
bashboy@host:~$myFolder=~/Files/Scripts/Main
引号阻止shell将波浪号扩展为其作为$HOME目录的特殊含义。
然后,您可以使用$myFolder 环境 strike>一个shell变量:
bashboy@host:~$cd $myFolder
bashboy@host:~/Files/Scripts/Main$
要创建别名,您需要定义别名:
alias myfolder="cd $myFolder"
然后,您可以将此类视为命令:
bashboy@host:~$myFolder
bashboy@host:~/Files/Scripts/Main$
除非你export,否则它实际上不是一个环境变量。
@KeithThompson好的,它只是一个shell变量。但是,您不希望导出它,因为您不希望它可能影响子进程。您可以在.bashrc或您使用的任何资源文件中以这种方式定义它,它将在直接shell中定义,但不在shell脚本中定义。
我更喜欢这种解决方案,因为它适用于自动完成
首先,您需要$访问"myFold"的值才能使问题中的代码工作:
cd"$myFold"
要简化此操作,请在~/.bashrc中创建别名:
alias cdmain='cd ~/Files/Scripts/Main'
不要忘记使用.bashrc一次来使别名在当前的bash会话中变得可用:
source ~/.bashrc
现在您可以使用以下命令切换到该文件夹
cdmain
另一种选择是使用符号链接。即:
ln -s ~/Files/Scripts/Main ~/myFold
之后,您可以执行~/myFold的操作,例如:
cp some_file.txt ~/myFold
这将把文件放在~/Files/Scripts/Main中。您可以随时使用rm ~/myFold删除符号链接,这将保留原始目录。
一个缺点:如果您cd myFold然后pwd,它将显示您在myFold中。这对我来说是一个交易破坏者,因为具有p4源代码控制的相对命令取决于当前目录。
@ User5910 - 使用pwd -P
但是也可以使用dir的实际别名
myScripts="~/Files/Scripts/Main"
alias myScripts="cd $myScripts"
这样您就有了一个通用的命名约定(对于每个目录/别名对),如果您需要将当前目录中的某些内容复制到myScripts,则不必考虑它。
IHTH
将以下行放在myscript中
set myFold = '~/Files/Scripts/Main'
在终端使用
source myscript
cd $myFold