2015-04-20 34 views
0

(注意:這是我發佈的後續問題zsh: Command substitution and proper quoting,但現在有一個額外的複雜功能)。zsh:命令替換,正確的引用和反斜槓(再次)

我有一個函數_iwpath_helper,輸出到標準輸出路徑,其中可能包含空格。爲了討論的緣故,讓我們假設_iwpath_helper總是返回一個固定的文本,例如

function _iwpath_helper 
{ 
    echo "home/rovf/my directory with spaces" 
} 

我也有一個功能quote_stripped需要一個參數,如果該參數用引號括起來,它刪除它們,並返回剩餘的文字。如果該參數未被引號包圍,則它將不變地返回。下面是它的定義:

function quote_stripped 
{ 
    echo ${1//[\"\']/} 
} 

現在我以下列方式結合兩種功能:

target=$(quote_stripped "${(q)$(_iwpath_helper)}") 

(當然,「quote_stripped」將是這個玩具例子是不必要的,因爲_iwpath_helper不返回這裏是一個以引號分隔的路徑,但在實際應用中,有時會這樣)。

現在的問題是,變化的目標包含真正反斜槓字符,也就是說,如果我做了

echo +++$target+++ 

我看到

+++home/rovf/my\ directory\ with\ spaces 

,如果我嘗試

cd $target 

我得到我的系統上的錯誤信息,即目錄

home/rovf/my/ directory/ with/ spaces 

將不存在。 (如果你想知道正斜槓來自哪裏:我在Cygwin上運行,並且我猜測cd命令只是將反斜槓解釋爲正斜槓,以便更好地適應Windows環境)。

我想反斜槓,實際出現在變量目標是由(q)擴展標誌,我適用於$(_ iwpath_helper)引起的。我的問題是現在我不能簡單地刪除(q),因爲如果沒有它,函數quote_stripped將僅在字符串的第一部分(直到第一個空間(/home/rovf/my))上得到參數$ 1, 。

我該如何正確書寫?

+1

我想你需要更清楚的例子,其中報價和unquoting是必要的。您顯示的'_iwpath_helper'函數只需使用'target = $(_ iwpath_helper)就可以正常工作。 cd $ target'。 – chepner

回答

0

chepner是正確的:我試圖解除引用字符串的方式是愚蠢的(我想太多了「Bourne Shell的方式」),我應該已經使用了(Q)標誌。

這裏是我的解決方案:

target="${(Q)$(_iwpath_helper)}" 

無需爲quote_stripped功能了....

1

我想你只是想避免嘗試去除手動報價,並使用(Q)擴展標誌。比較:

% v="a b c d" 
% echo "$v" 
a b c d 
% echo "${(q)v}" 
a\ b\ c\ d 
% echo "${(Q)${(q)v}}" 
a b c d