(注意:這是我發佈的後續問題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, 。
我該如何正確書寫?
我想你需要更清楚的例子,其中報價和unquoting是必要的。您顯示的'_iwpath_helper'函數只需使用'target = $(_ iwpath_helper)就可以正常工作。 cd $ target'。 – chepner