How to make an "alias" for a long path?

我尝试为 shell 脚本编程时经常使用的路径创建一个“别名”。我尝试了一些方法,但失败了:

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


bash: cd: myFold: No such file or directory

How do I make it work ?
但是,cd ~/Files/Scripts/Mainworks。

154277 次浏览

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

cd "$myFold"

为了简化这一点,您可以在 ~/.bashrc中创建一个别名:

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

不要忘记为 .bashrc提供一次源代码,以使别名在当前 bash 会话中可用:

source ~/.bashrc

现在您可以使用以下方法更改到该文件夹:

cdmain

但是也可以使用 dir 的实际别名,试试吧

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

这样你就有了一个共同的变数命名原则(对于每个 dir/alias 对) ,如果你需要从当前的 dir 复制一些东西到 myScripts,你不必考虑它。

IHTH

因为它是一个环境变量(别名在 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

First off, you need to remove the quotes:

bashboy@host:~$ myFolder=~/Files/Scripts/Main

引号阻止 shell 将波浪线扩展为 $HOME目录的特殊含义。

然后您可以使用 $myFolder一个环境一个 shell 变量:

bashboy@host:~$ cd $myFolder
bashboy@host:~/Files/Scripts/Main$

要创建 alias,您需要定义别名:

alias myfolder="cd $myFolder"

然后,您可以将这种情况视为命令:

bashboy@host:~$ myFolder
bashboy@host:~/Files/Scripts/Main$

您可以向 bash 的散列表添加任何您想要的路径:

hash -d <CustomName>=<RealPath>

现在你将能够 cd ~<CustomName>。使它永久添加到您的 巴希尔脚本。

注意,这个哈希表意味着为 bash 提供一个缓存,而不需要在每次执行命令时搜索内容,因此这个表将在使缓存失效的事件上被清除,例如修改 $PATH

There is a shell option cdable_vars:

cdable_vars
如果设置了这个参数,则为 cd内置参数 不是目录的命令假定为 变量,其值是要更改到的目录。

You could add this to your .bashrc:

shopt -s cdable_vars
export myFold=$HOME/Files/Scripts/Main

注意,我已经用 $HOME替换了波浪线; 引号阻止波浪线展开,而 Bash 会抱怨没有目录 ~/Files/Scripts/Main

现在你可以这样使用:

cd myFold

不需要 $。这就是问题的关键所在,实际上如其他答案所示,cd "$myFold"在没有 shell 选项的情况下也能正常工作。如果 myFold中的路径包含空格,则 cd myFold也可以工作,不需要引号。

这通常甚至与 tab 自动完成一起工作,因为 bash_completion中的 _cd函数检查 cdable_vars是否设置为 & nash; 但不是每个实现都以相同的方式执行,所以您可能需要在 .bashrc中再次源代码 bash_completion(或者编辑 /etc/profile以设置 shell 选项)。


其他 shell 也有类似的选项,例如 Zsh (cdablevars)。

另一个选择是使用一个符号链接。例如:

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

After that you can perform operations to ~/myFold, such as:

cp some_file.txt ~/myFold

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

也许用链接更好

软连结

符号或软链接(文件或目录,更灵活和自我文档化)

#      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

在你的脚本中加入以下一行

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

在终端使用中

source myscript
cd $myFold

我尝试的前面的答案不允许自动扩展(自动完成)别名目录的子目录。

但是,如果您将要作为别名的目录推到 dirs堆栈上..。

$ pushd ~/my/aliased/dir

然后你可以输入 dirs -v来查看它在堆栈中的数字位置:

 0  ~/my/aliased/dir
1  ~/Downloads
2  /media/usbdrive

and refer to it using that number for most if not all commands that expect a directory parameter:

 $ mv foo.txt ~0

You can even use Tab to show the immediate subdirectories of the "aliased" directory:

 $ cd ~0/<Tab>
child_dir1    child_dir2