如何为长路径制作“别名”?

时间:2013-07-30 22:28:31

标签: linux bash unix scripting

我尝试为shell编写时经常使用的路径创建“别名”。我试了一下,但失败了:

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

bash: cd: myFold: No such file or directory

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

10 个答案:

答案 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