Bashの関数パラメータに$引用符(コマンドを置き換える)

Bashの関数パラメータに$引用符(コマンドを置き換える)

私は見たことがないBashで$(コマンドを置き換える)内で引用そして、まだ私が間違っていることを理解していません(私のコードが許可された答えで「推奨される方法」のように見えます)。そして解決策は次のとおりです。

print_and_run(){
    echo next line: "$1"
    echo "$($1)"
}

print_and_run 'sed --in-place -- "s|fetch = +refs/\*:refs/\*|fetch = +refs/heads/*:refs/remotes/origin/*|" .git/config' 
next line: sed --in-place -- "s|fetch = +refs/\*:refs/\*|fetch = +refs/heads/*:refs/remotes/origin/*|" .git/config
sed: -e expression #1, char 1: unknown command: `"'

sed行は独立して機能し、この関数はprint_and_run引用符なしでコマンドで動作します(例:print_and_run 'cat ./.git/config'TIA)。

PS ところで、これが重要かどうかはわかりません。改行を使用して印刷しないようにecho "$($1)"書きました。echo $($1)https://stackoverflow.com/questions/15184358/how-to-avoid-bash-command-substitution-to-remove-the-newline-character、今、電子が「推奨される方法」のように見えます。)

答え1

他のアプローチを試してみることもできます。

print_and_run() {
    printf "next line:"
    printf " '%s'" "$@"
    printf "\n"

    echo "$("$@")"
}

print_and_run sed --in-place -- "s|fetch = +refs/\*:refs/\*|fetch = +refs/heads/*:refs/remotes/origin/*|" .git/config

結果:

next line: 'sed' '--in-place' '--' 's|fetch = +refs/\*:refs/\*|fetch = +refs/heads/*:refs/remotes/origin/*|' '.git/config'

この例では、元の参照が保存されます。ただし、パイプやリダイレクトなどの機能はまだ機能していません。

まったく異なるアプローチは、シェルの組み込みコマンドを使用して印刷することです。

 set -x
 sed --in-place -- "s|fetch = +refs/\*:refs/\*|fetch = +refs/heads/*:refs/remotes/origin/*|" .git/config
 set +x

次の行が印刷されます。

+ sed --in-place -- 's|fetch = +refs/\*:refs/\*|fetch = +refs/heads/*:refs/remotes/origin/*|' .git/config

したがって、ユーザー自身の印刷コマンドをまったく実装する必要はなく、シェルはこれを行います。

関連情報