我尝试为 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。
cd ~/Files/Scripts/Main
首先,您需要 $来访问“ myFold”的值,以使问题中的代码工作:
$
cd "$myFold"
为了简化这一点,您可以在 ~/.bashrc中创建一个别名:
~/.bashrc
alias cdmain='cd ~/Files/Scripts/Main'
不要忘记为 .bashrc提供一次源代码,以使别名在当前 bash 会话中可用:
.bashrc
source ~/.bashrc
现在您可以使用以下方法更改到该文件夹:
cdmain
但是也可以使用 dir 的实际别名,试试吧
myScripts="~/Files/Scripts/Main" alias myScripts="cd $myScripts"
这样你就有了一个共同的变数命名原则(对于每个 dir/alias 对) ,如果你需要从当前的 dir 复制一些东西到 myScripts,你不必考虑它。
IHTH
因为它是一个环境变量(别名在 bash中有不同的定义) ,所以你需要这样来评估它:
bash
cd "${myFold}"
或:
cp "${myFold}/someFile" /somewhere/else
但实际上我发现创建一个 真的别名(在 bash启动文件中的一个,比如 .bashrc)更容易,如果你只是想方便地切换到那个目录,那么我可以节省击键次数:
alias myfold='cd ~/Files/Scripts/Main'
然后你可以直接使用(不使用 cd) :
cd
myfold
为了去掉这个定义,你可以使用 unalias。下面的文字记录显示了这些 所有的运作情况:
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目录的特殊含义。
$HOME
然后您可以使用 $myFolder一个环境一个 shell 变量:
$myFolder
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>。使它永久添加到您的 巴希尔脚本。
cd ~<CustomName>
注意,这个哈希表意味着为 bash 提供一个缓存,而不需要在每次执行命令时搜索内容,因此这个表将在使缓存失效的事件上被清除,例如修改 $PATH。
$PATH
There is a shell option cdable_vars:
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。
~/Files/Scripts/Main
现在你可以这样使用:
cd myFold
不需要 $。这就是问题的关键所在,实际上如其他答案所示,cd "$myFold"在没有 shell 选项的情况下也能正常工作。如果 myFold中的路径包含空格,则 cd myFold也可以工作,不需要引号。
myFold
这通常甚至与 tab 自动完成一起工作,因为 bash_completion中的 _cd函数检查 cdable_vars是否设置为 & nash; 但不是每个实现都以相同的方式执行,所以您可能需要在 .bashrc中再次源代码 bash_completion(或者编辑 /etc/profile以设置 shell 选项)。
bash_completion
_cd
/etc/profile
其他 shell 也有类似的选项,例如 Zsh (cdablevars)。
cdablevars
另一个选择是使用一个符号链接。例如:
ln -s ~/Files/Scripts/Main ~/myFold
After that you can perform operations to ~/myFold, such as:
~/myFold
cp some_file.txt ~/myFold
它将把文件放在 ~/Files/Scripts/Main中。您可以随时使用 rm ~/myFold删除符号链接,它将保留原始目录。
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堆栈上..。
dirs
$ pushd ~/my/aliased/dir
然后你可以输入 dirs -v来查看它在堆栈中的数字位置:
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