如何为漫长的道路做一个“别名”?


94

我尝试为我在shell脚本编写过程中经常使用的路径设置“别名”。我尝试了一些方法,但是失败了:

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

bash: cd: myFold: No such file or directory

我该如何运作?
但是,cd ~/Files/Scripts/Main可行。

Answers:


119

由于它是环境变量(别名在中具有不同的定义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。我收到一个错误-没有这样的目录。为什么呢 另外,是否可以“取消分配”别名变量?
bashboy

myfold ='〜/ some / path'cd“ $ myfold”失败。为什么呢
bashboy

1
@bashboy,可能是因为您没有该名称的目录。〜/ some / path是一个示例,您应该替换要使用的实际路径。我将其更改为使用您的示例目录,以使其更清晰。至于如何取消分配别名,请使用unalias命令。我还用成绩单(包括该命令的使用)更新了答案。
paxdiablo

您如何在不同的终端会话中保留此别名?当我打开一个新标签并尝试使用该别名时,它不起作用。
goldisfine

4
@goldisfine,请参阅我的括号in one of the bash startup files like .bashrc。将别名放入合适的启动文件中将确保该别名可用于所有会话。
paxdiablo

74

有一个shell选项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_completioncdable_varsbash_completion.bashrc/etc/profile


其他外壳程序具有类似的选项,例如Zsh(cdablevars)。


1
ZSH有与之等效的功能吗?
Ryan Stull

1
@RyanStullsetopt cdablevars看起来可能是这样,但是我一点都不了解zsh。
本杰明·

@JohnMee我将回滚您的编辑,因为a)在zsh中调用该选项的方式有所不同(无下划线)b)仅标记了Bash的问题,以及c)我链接到Bash手册。不过,我将添加一段以提及其他外壳。
本杰明·

1
很好的答案!非常感谢cdable_vars
Lucas P.

1
@Vladislav注意,这破坏了cdbash-completion使用_cd函数(complete -o nospace -F _cd cd)所提供的完成。添加-v它(完成变量)是可行的,但是会产生不希望有的副作用-对我来说,当我选择完成时,它显示了我的完整环境。
本杰明·W。

10

也许最好使用链接

软链接

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

#      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

9

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

hash -d <CustomName>=<RealPath>

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

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


2
我认为它只能在中工作,zsh而不能在中工作bash
sergej

恕我直言,这是最好的答案,但确实如此zsh,至少在我的Ubuntu系统上,它才有效。
约翰·斯图尔特

6

首先,您需要删除引号:

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$

除非您使用,否则它实际上不是环境变量export
基思·汤普森

1
@KeithThompson好的,这只是一个shell变量。但是,您不想导出它,因为您不希望它可能影响子进程。您可以通过这种方式在您.bashrc使用的资源文件或您使用的任何资源文件中对其进行定义,并且将在直接shell中定义它,而不是在shell脚本中定义它。
David W.

我喜欢这种解决方案,因为它可以自动完成
Vassilis

5

首先,您需要$访问“ myFold”的值以使问题中的代码起作用:

cd "$myFold"

为了简化此过程,您可以在中创建一个别名~/.bashrc

alias cdmain='cd ~/Files/Scripts/Main'

别忘了.bashrc一次获取使别名在当前bash会话中可用的信息:

source ~/.bashrc

现在,您可以使用以下命令更改到该文件夹​​:

cdmain

4

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

ln -s ~/Files/Scripts/Main ~/myFold

之后,您可以对执行操作~/myFold,例如:

cp some_file.txt ~/myFold

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


一个缺点:如果你cd myFold那么pwd,它会显示你在myFold。对我来说这是一个大问题,因为带有p4源代码控制的相对命令取决于当前目录。
User5910

1
@ User5910 -使用pwd -P
DVJ

2

但也可以使用目录的实际别名,请尝试

 myScripts="~/Files/Scripts/Main"
 alias myScripts="cd $myScripts"

这样,您就具有一个通用的命名约定(针对每个目录/别名对),并且如果您需要将某些内容从当前目录复制到myScripts,则无需考虑。

高温超导


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

-1

将以下行放在您的myscript中

set myFold = '~/Files/Scripts/Main'

在终端使用

source myscript
cd $myFold
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.