zsh関数パラメータに二重引用符を追加するには?

zsh関数パラメータに二重引用符を追加するには?

.zshrcには次のように定義された関数があります。

fdtnxg () {
    find $1 -type $2 -name "$3" | xargs grep "${@:4}"
}

現在のディレクトリの名前がfdtnxgalias mottt.fdtnxg . f "tt.*" "alias mot"

fdtnxg . f tt.* alias mot自分で使いたいのに使えません。期待どおりに動作させる方法はありますか?

私が変えようとしているのはfdtnxg次のとおりです。

fdtnxg () {
    find $1 -type $2 -name "\"$3\"" | xargs grep "${@:4}"
}

echo "\"123\""見積もりを受けたのでこれを試しました"123"

答え1

ここに2つの質問があると思います。

まず、関数を実行するときにシェルがワイルドカードを使用しないようにします。実行前にファイル名が関数の引数に拡張されるため、関数の内部に引用符を追加してこれを行うことはできません。ファイル名の拡張を防ぐには、alias()を使用して自動化できるnoglob fdtnxgこの関数を実行してくださいalias fdtnxg="noglob fdtnxg"

2. Grepパラメータ。 4番目から始まる関数引数をgrepの単一の文字列に連結したいとします。"${@:4}"、別の単語に展開します("$@"すべての位置パラメータと同様)。"$*"代わりに、パラメータを単一の文字列に連結してください。 Zshでは、"${*[4,-1]}"4番目以降のパラメータを連結することが可能です。 ("${*:4}"すべて接続して4番目から始めてください。特徴、これはBashが行うのとは異なります。 )それでもうまくいかない場合は、いつでも最初の3つを外に移動して使用できます"$*"

だからどちらにしても

fdtnxg () {
    find "$1" -type "$2" -name "$3" -exec \
      grep -- "${*[4,-1]}" /dev/null {} +
}

または

fdtnxg () {
    local dir=$1
    local type=$2
    local name=$3
    shift 3
    find "$dir" -type "$type" -name "$name" -exec \
      grep -- "$*" /dev/null {} +
}

そして

alias fdtnxg="noglob fdtnxg"

findとにかく、出力をそのようにパイプに接続することはできませんxargs-print0/ GNU拡張子が必要です-0。または、ここでは標準の-exec cmd {} +検索構文を使用することをお勧めします(ファイルが1つしか見つからない場合でも、ファイル名が常に印刷されるようにパラメータを追加します。GNU/dev/nullではそのオプションも使用できます)。grepfindgrep-H

関連情報