2012-06-05 49 views
0

我正在查看一些别名以快速保存当前目录以便稍后可以打开。Bash避免文件名解释

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

sed命令显然处理空格。

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

[email protected]:~# cd Hello\ World/ 
[email protected]:~/Hello World# pwd|sed 's/ /\\ /g' > ~/.cdo 
[email protected]:~/Hello World# cat ~/.cdo 
/home/jk/Hello\ World 
[email protected]:~/Hello World# cd .. 
[email protected]:~# cd "$(cat ~/.cdo)" 
bash: cd: /home/jk/Hello\ World: No such file or directory 
+0

见http://mywiki.wooledge.org/BashFAQ/050理解为​​什么这种行为正在发生的事情:引用变量替换(!这是用正确的事)不处理转义,也不应该。 –

+0

这是更好的解决这个问题。['PUSHD,popd'(http://cli.learncodethehardway.org/book/cli-crash-coursech8.html)和'在Unix中的所有可用的口味命令dirs'。 – anubhava

+0

退房acd_func.sh - 延长bash的定期存款,以便保持,显示和访问过的目录名的访问历史在http://geocities.com/h2428/petar/acd_func.htm – Tom

回答

2

在我看来,如果你正在加倍屏蔽。

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

cd here\ I\ go 

或用双引号来掩盖所有的人:

cd "here I go" 

,而这将被允许,以及:

cd here" I "go 

但是,混合它们意味着,你需要从字面上反斜杠:

cd "here\ I\ go" 

这就是发生了什么事。

注意的是,虽然不是很常见,制表符和换行符可以包含在文件中也是如此。掩蔽它们的方式相同,但是从文件中读取它们可能会有所不同,并且多个空白常常由外壳压缩为单个空白。

1

您有\逃脱如果文件名是不是和"

cdo逃离,但在CDN

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

不是不使用"逃逸,使用""之间"(我认为这是更好

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

的问题,更确切地说,是他*不该” t *在不会被解析的内容中进行手动转义。那么你的第二个例子是正确的,但是这个解释有误导性。 –