bash 别名可以是路径吗?
您好,对于菜鸟问题提前表示歉意。我注意到使用 bash 别名时出现奇怪的行为。
我的目标
的方法是为常用路径使用简短的 bash 别名,以使 shell 中的导航更加容易。作为示例,为了快速导航到uni
安装在的数据驱动器上的 University () 文件夹,/mnt/data
我使用了 bash 别名alias uni='/mnt/data/uni'
。现在,如果我在父目录中/mnt/data
并运行cd uni
,这将像我想象的那样工作,并且我会移动到/mnt/data/uni
.
问题
但是,如果我在另一个驱动器上,例如在我的根目录中,并且我运行相同的命令,则会收到错误bash: cd: uni: No such file or directory
。如果我只执行uni
,输出bash: /mnt/data/uni: Is a directory
表明 bash “理解”这是一个目录。但由于某种原因,当不在父目录中时,别名无法与 cd 功能一起使用来移动到该目录。
如果我将该cd
命令添加到我的别名中,使其读取为alias uni='cd /mnt/data/uni'
,则该别名适用于所有目录。但是我希望只有别名中的路径才能使用其他函数。现在我可以忍受将 包含cd
到别名中,因为我对这些目录所做的 99% 的操作只是导航,但最让我烦恼的是我显然不完全理解别名在这种情况下如何工作。
我的问题
有人可以解释为什么我的别名会这样以及我在这里缺少什么吗?仅使用别名路径的解决方案也很方便。
多谢!干杯
答案1
不,别名不能是路径。或者,更准确地说,它们只能是通往可以执行的事物的路径。别名作为命令运行,因此alias uni=/bin/ls'
可以工作,因为这是指向命令的路径。但是,alias uni=/mnt/data/uni
它将不起作用,因为它uni
是一个目录并且无法执行。
当您进入时它起作用的原因/mnt/data
是因为您有一个名为 的子目录uni
,因此cd uni
只需移动到该目录即可。这里甚至没有调用别名。这根本不相关。 shell 看到的只是一个命令 ( cd
) 和一个目标(目录uni
),别名功能根本没有被调用。
如果您想让目录像这样轻松访问,您可以将它们设置为变量。将其添加到您的~/.bashrc
文件中:
uni="/mnt/data/uni"
保存文件,打开一个新终端,您现在可以从任何地方cd "$uni"
移动到。/mnt/data/uni
答案2
别名不能是路径。他们只能是指挥。如果您运行cat uni/file.txt
或cd uni
,bash 永远不会尝试扩展uni
为别名。如果你希望这种情况发生,最接近的事情就是使它成为多变的。
uni=/mnt/data/uni
cd $uni
cat $uni/file.txt
请注意,如果路径包含空格(或文件名中很少出现的其他特殊字符),您使用变量时需要双引号:
pol="/mnt/data/Pol Sci"
cat "$pol/file.txt" # works
cat "$pol"/file.txt # works
cat $pol/file.txt # doesn't work: tries to print the content of /mnt/data/Pol and of Sci.txt
如果您启用cdable_vars
选项,您可以节省键入$
和双引号。
shopt -s cdable_vars
pol="/mnt/data/Pol Sci"
cd "$pol" # works
cd $pol # doesn't work ("cd: too many arguments")
cd pol # works thanks to cdable_vars
但是,如果您只对命令的快捷方式感兴趣cd
,则只需将其包含cd
在别名中即可。
alias uni='cd /mnt/data/uni'
uni # equivalent to cd /mnt/data/uni
alias pol='cd "/mnt/data/Pol Sci"'
pol # equivalent to cd "/mnt/data/Pol Sci"
或者,或者此外,您可以启用autocd
选项。这会导致 bash 将命令位置中的目录解释为更改目录的指令。
shopt -s autocd
/some/where # equivalent to cd /some/where
即使你这样做,你也可以将其包含cd
在你的uni
别名中,因为别名不能做任何其他事情。
另一个值得一提的相关功能是CDPATH
多变的。它允许您定义“快速目录更改”位置。例如:
CDPATH=$HOME:/mnt/data
cd /some/where
cd uni
该命令cd uni
将首先尝试更改为/some/where/uni
,然后如果不存在它将尝试$HOME/uni
,然后如果不存在它将尝试/mnt/data/uni
。您可能喜欢也可能不喜欢这个功能,因为一方面它有时很方便,但另一方面它很容易意外地更改到您不想要的目录并最终处理错误的项目。
答案3
虽然其他回答者认为 bash 不允许使用路径别名是正确的,但你可以考虑切换到 zsh,它有全局别名,这可能是一条路径。
alias -g uni=/mnt/data/uni
cd uni
在 zsh 中有效,但在 bash 中无效。