我看过在 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
line 独立工作,函数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'
在此示例中,保留了原始引用。然而,管道或重定向之类的东西仍然不起作用。
一种完全不同的方法是依赖 shell 的内置命令打印:
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
因此,您根本不必实现自己的打印命令,shell 已经为您完成了。