在 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: `"'

sedline 独立工作,函数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 已经为您完成了。

相关内容