我尝试为shell编写时经常使用的路径创建“别名”。我试了一下,但失败了:
myFold="~/Files/Scripts/Main"
cd myFold
bash: cd: myFold: No such file or directory
我如何使它工作?
但是,cd ~/Files/Scripts/Main
有效。
答案 0 :(得分:91)
由于它是一个环境变量(别名在bash
中有不同的定义),您需要使用以下内容对其进行评估:
cd "${myFold}"
或:
cp "${myFold}/someFile" /somewhere/else
但实际上我觉得更容易,如果你只想轻松切换到该目录,创建一个真正的别名(在bash
启动文件之一,如{{1 }}),所以我可以保存击键:
.bashrc
然后你可以使用(没有alias myfold='cd ~/Files/Scripts/Main'
):
cd
要删除定义,请使用myfold
。以下成绩单显示了所有这些:
unalias
答案 1 :(得分:48)
有一个shell选项cdable_vars
:
cdable_vars
如果设置了此参数,则cd
内置参数 假定不是目录的命令是a的名称 变量,其值是要更改的目录。
您可以将其添加到.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
中的bash_completion
函数会检查是否设置了cdable_vars
- 但并非每个实现都以相同的方式执行,因此您可能需要在您的bash_completion
中再次搜索.bashrc
(或编辑/etc/profile
以设置shell选项)。
其他shell有类似的选项,例如Zsh(cdablevars
)。
答案 2 :(得分:7)
也许最好使用链接
符号链接或软链接(文件或目录,更灵活且具有自记录功能)
# 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
How to create a link to a directory
提示:如果您不需要在家庭中看到链接,则可以以点开头。 ;那么默认情况下它将被隐藏,然后您可以像访问它一样
cd ~/.myHiddelLongDirLink
答案 3 :(得分:5)
首先,您需要$
访问“myFold”的值才能使问题中的代码生效:
cd "$myFold"
为简化此操作,请在~/.bashrc
中创建别名:
alias cdmain='cd ~/Files/Scripts/Main'
不要忘记提取.bashrc
一次以使别名在当前的bash会话中可用:
source ~/.bashrc
现在您可以使用以下命令切换到该文件夹:
cdmain
答案 4 :(得分:5)
首先,您需要删除引号:
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$
答案 5 :(得分:5)
您可以将任何路径添加到bash的哈希表中:
hash -d <CustomName>=<RealPath>
现在您将能够cd ~<CustomName>
。要使其永久化,请将其添加到 bashrc 脚本中。
请注意,此哈希表旨在为每次执行命令时不需要搜索内容的bash提供缓存,因此该表将在使缓存无效的事件上清除,例如,修改$PATH
。
答案 6 :(得分:4)
另一种选择是使用符号链接。即:
ln -s ~/Files/Scripts/Main ~/myFold
之后,您可以对~/myFold
执行操作,例如:
cp some_file.txt ~/myFold
将文件放在~/Files/Scripts/Main
中。您可以随时使用rm ~/myFold
删除符号链接,该链接将保留原始目录。
答案 7 :(得分:2)
但也可以使用dir的实际别名,尝试
myScripts="~/Files/Scripts/Main"
alias myScripts="cd $myScripts"
这样你就有了一个共同的命名约定(对于每个dir / alias对),如果你需要将当前dir中的东西复制到myScripts,你就不必考虑它了。
IHTH
答案 8 :(得分: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
答案 9 :(得分:-1)
将以下行放在myscript中
set myFold = '~/Files/Scripts/Main'
在终端中使用
source myscript
cd $myFold