Bash避免文件名解释

时间:2012-06-05 15:25:35

标签: bash variables interpretation

我正在查看一些别名以快速保存当前目录,以便以后可以打开。

ALIAS cdo='pwd|sed 's/ /\ /g' > ~/.cdo'
AIIAS cdn='cd "$(cat ~/.cdo)"'

sed命令显然处理空格。

然而,我仍然有一个奇怪的问题,我无法修复,必须涉及变量解释。

jk@bt:~# cd Hello\ World/
jk@bt:~/Hello World# pwd|sed 's/ /\\ /g' > ~/.cdo
jk@bt:~/Hello World# cat ~/.cdo
/home/jk/Hello\ World
jk@bt:~/Hello World# cd ..
jk@bt:~# cd "$(cat ~/.cdo)"
bash: cd: /home/jk/Hello\ World: No such file or directory

2 个答案:

答案 0 :(得分:2)

在我看来,好像你正在加倍掩盖。

处理空格的一种方法是使用反斜杠单独屏蔽它们:

 cd here\ I\ go 

或用双引号屏蔽所有这些:

 cd "here I go" 

虽然这也是允许的:

 cd here" I "go

然而,混合它们意味着你想要字面上的反斜杠:

 cd "here\ I\ go" 

这就是发生的事情。

请注意,虽然不常见,但标签和换行也可以包含在文件中。屏蔽它们的工作方式相同,但是从文件中读取它们可能会有所不同,并且多个空白通常由shell压缩为单个空格。

答案 1 :(得分:1)

如果文件名不在\"

之间,则必须使用"转义

使用cdo转义,但未在cdn中使用"

ALIAS cdo='pwd|sed 's/ /\ /g' > ~/.cdo'
AIIAS cdn='cd $(cat ~/.cdo)'

没有转义并使用""(我认为这是更好

ALIAS cdo='pwd > ~/.cdo'
AIIAS cdn='cd "$(cat ~/.cdo)"'