/ / zsh:コマンド置換、適切な引用符とバックスラッシュ(再び) - zsh

zsh:コマンド置換、適切な引用符とバックスラッシュ(もう一度) - zsh

(注:これは私の投稿の後継質問です 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はここで引用符で区切られたパスを返さないからですが、実際のアプリケーションでは時々そうなります)。

問題は、変数targetにが含まれていることです。 リアル バックスラッシュ文字、つまり、

echo +++$target+++

そうですか

+++home/rovf/my directory with spaces

そして私がしようとした場合

cd $target

システムにエラーメッセージが表示されます。

home/rovf/my/ directory/ with/ spaces

存在しないでしょう。

(あなたが先に疑問に思っている場合にはスラッシュはCygwin上で実行されています。この場合、cdコマンドはバックスラッシュをスラッシュとして解釈するので、Windows環境に適しています。

物理的に変数に現れるバックスラッシュを推測します ターゲット これは、(q)拡張フラグが原因で発生します。$(_ iwpath_helper)に適用されます。私の問題は、それがなければ、関数quote_strippedが最初のスペースまで、文字列の最初の部分だけをパラメータ$ 1に設定することになるので、単純に(q)を削除できないことです。/ home / rovf / my)。

どうすればこれを正しく書くことができますか?

回答:

回答№1は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

回答№2の場合は0

chepnerは正しかった:私が文字列の引用符を外そうとした方法はばかげていた(私は「Bourne Shellの方法」で考えすぎていた)、そして私は(Q)フラグを使うべきだった。

ここに私のソリューションです:

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

quote_stripped関数はもう必要ありません。