2

zsh でのパラメーター展開中に問題が発生しました。変数が引用符で囲まれています。

これが私のスクリプトです。(ノイズについてお詫びします。本当に重要なのは呼び出しの最後の行だけfindですが、コードの詳細を隠していないことを確認したかったのです)

    #broken_links [-r|--recursive] [<path>]
    # find links whose targets don't exist and print them. If <path> is given, look
    # at that path for the links. Otherwise, the current directory is used is used.
    # If --recursive is specified, look recursively through path.
    broken_links () {
        recurse=
        search_path=$(pwd)

        while test $# != 0
        do
                case "$1" in
                        -r|--recursive)
                                recurse=t
                                ;;
                        *)
                                if test -d "$1"
                                then
                                        search_path="$1"
                                else
                                        echo "$1 not a valid path or option"
                                        return 1
                                fi
                                ;;
                esac
                shift
        done

      find $search_path ${recurse:--maxdepth 1} -type l ! -exec test -e {} \; -print
    }

明確にするために、このfind行では、次のようにしたいと思いrecurseます-maxdepth 1recurseが に設定されている場合はt、何も置換しません (つまり、通常の再帰動作である find を実行させます)。

これは単なる${name:-word}形式ですが、word実際にはハイフンで始まるため、一見すると奇妙に感じるかもしれません。(これについて詳しくは、http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansionを参照してください)

代わりに、recurseが null の場合は置換され"-maxdepth 1"(周囲の引用符に注意してください)、recurseが設定されている場合は が置換され""ます。

再帰しない場合の正確なエラーは です find: unknown predicate `-maxdepth 1'find "-maxdepth 1"たとえば、次のように言うだけで、これを自分で試すことができます。再帰が必要な場合、何か奇妙なことが起こっています。うまく説明できませんが、エラーはfind `t': No such file or directory.

zsh がこのパラメータ展開に引用符を置かないようにする方法を知っている人はいますか? ここが私の問題だと思います。

ありがとう。

4

1 に答える 1

4

zsh は実際にはその周りに引用符を追加していません。パラメーター展開の結果に対して単語分割を行っていないだけです。これは、デフォルトで動作することが文書化されている方法です。パラメータ展開セクションzshexpnの先頭付近のマニュアル ページから:

Note  in  particular  the  fact that words of unquoted parameters are not 
automatically split on whitespace unless the option SH_WORD_SPLIT is set

そのため、 を実行してそのオプションを設定しsetopt sh_word_split、すべてのパラメーター展開に対して分割を行うか、次を使用してその展開だけを明示的に要求することができます。

${=recurse:--maxdepth 1}

=中括弧内の最初の文字としての記号に注意してください。これはzshexpnman ページにも記載されており、 を検索してください${=spec}

于 2013-04-24T20:43:05.217 に答える