私は見たことがない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
したがって、ユーザー自身の印刷コマンドをまったく実装する必要はなく、シェルはこれを行います。