2013-07-30 73 views
47

我试图为shell脚本中经常使用的路径创建一个“别名”。我尝试了一些,但失败了:如何为长路径创建“别名”?

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

bash: cd: myFold: No such file or directory 

我该如何使它工作?
但是,cd ~/Files/Scripts/Main的作品。

回答

66

因为它是一个环境变量(别名在bash不同的定义),你需要的东西,如对其进行评估:

cd "${myFold}" 

或:

cp "${myFold}/someFile" /somewhere/else 

但实际上,我发现它更容易,如果您只是想轻松切换到该目录,可以创建一个真实其他S(像.bashrcbash的启动文件中),这样我就可以节省按键:

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 
+0

谢谢。这样可行。我只尝试了别名myfold ='〜/ some/path'和cd myfold。我得到一个错误 - 没有这样的目录。为什么?另外,是否有可能“取消”一个别名变量? – bashboy

+0

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

+0

@bashboy,可能是因为你没有这个名字的目录。 〜/ some/path是一个例子,你应该替换你想要使用的_actual_路径。我会将其更改为使用示例目录,以便更清晰。至于如何取消分配别名,可以使用unalias命令。我还用一份成绩单更新了答案,包括使用该命令。 – paxdiablo

3

首先,你需要$访问“myFold”的值,使在问题的工作代码:你在~/.bashrc创建别名

cd "$myFold" 

为了简化:

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

不要忘记一次发送.bashrc以使别名在当前bash会话中可用:

source ~/.bashrc 

现在你可以使用切换到文件夹:

cdmain 
1

但对于一个目录的实际别名也有可能,尽量

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

这种方式,你有一个共同的命名约定(对于每个目录/别名对),并且如果您需要将当前目录中的内容复制到myScripts,则不必考虑它。

IHTH

5

首先,你需要删除引号:

[email protected]:~$ myFolder=~/Files/Scripts/Main 

引号阻止shell扩展波浪号的特殊意义成为您的$HOME目录。

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

[email protected]:~$ cd $myFolder 
[email protected]:~/Files/Scripts/Main$ 

若要使别名,您需要定义别名:

​​

然后可以把这个有点像命令:

[email protected]:~$ myFolder 
[email protected]:~/Files/Scripts/Main$ 
+0

它实际上并不是一个* environment *变量,除非您将其导出。 –

+0

@KeithThompson好吧,它只是一个_shell变量_。但是,您不想导出它,因为您不希望它可能影响子进程。您可以用'.bashrc'或其他任何资源文件来定义它,它将在直接shell中定义,而不是在shell脚本中定义。 –

+0

我更喜欢这种解决方案,因为它适用于自动完成 – Vassilis

1

您可以添加任何你想要的路径,你的bash的哈希表:

hash -d <CustomName>=<RealPath>

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

请注意,这个散列表旨在为bash提供一个缓存,而不必在每次执行命令时都搜索内容,因此这个表将在导致缓存无效的事件上被清除,例如,修改$PATH

29

有一个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中的路径包含空格,不需要引用。

这通常即使有标签自动完成在bash_completion检查_cd功能工作,如果cdable_vars设置–但不是每一个实施做它以同样的方式,所以你可能在你的.bashrc再次源bash_completion(或编辑/etc/profile到设置shell选项)。

1

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

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

之后,你可以执行操作~/myFold,如:

cp some_file.txt ~/myFold 

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