exec sh 検索: シェル変数がサブシェルに渡されませんでした。

exec sh 検索: シェル変数がサブシェルに渡されませんでした。

以下は、親ディレクトリと拡張子と同じファイル名が含まれている場合にディレクトリ名を印刷する単純化されたコードです.md

FIND(){
    find . -type d -exec sh -c '
        for d do
            [ -f "${d}/${d##*/}.md" ] && printf "%s\n" "$d"
        done' find-sh {} +
}


FIND

${d}/${d##*/}.md簡単に言えば、クエリを関数の引数として送信したいのですが、FIND残念ながら何も出力されません。

FIND(){
    local SearchTerm="${1}"
    find . -type d -exec sh -c '
        for d do
            [ -f "${SearchTerm}" ] && printf "%s\n" "$d"
        done' find-sh {} +
}

FIND '${d}/${d##*/}.md'

私は引用文にいくつかの問題があると確信していますSearchTerm。どのようなヒントがありますか?


試しましたがFIND '\${d}/\${d##*/}.md'出力がありません

ベストアンサー1

"${SearchTerm}"sh -c '次のように推論するには、外部にいる必要があります。

FIND(){
    local SearchTerm="${1}"
    find . -type d -exec sh -c '
        for d do
            [ -f "'"${SearchTerm}"'" ] && printf "%s\n" "$d"
        done' find-sh {} +
}

FIND '${d}/${d##*/}.md'

これをもう少し説明するために、簡単なテストを実行できます。

SearchTerm='${d}/${d##*/}.md'
echo 'Before "$SearchTerm" After'
# output : Before "$SearchTerm" After
echo 'Before "'"$SearchTerm"'" After'
# output : Before "${d}/${d##*/}.md" After

'Before "$SearchTerm" After'はすべて単一引用符で囲まれているため、パラメータ拡張のない単一の文字列です。

'Before "'"$SearchTerm"'" After'実際には3つの文字列が連結されています。

'Before "'#最後に二重引用符の後に一重引用符が続きます。

"$SearchTerm"#ここでパラメータ拡張が発生します。

'" After' #一重引用符で始まり、次に二重引用符が続きます。

もっと明確になりますように。

おすすめ記事