2012-06-05 81 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 *在不會被解析的內容中進行手動轉義。那麼你的第二個例子是正確的,但是這個解釋有誤導性。 –