我有一个shell脚本,它执行一个带有一堆参数的命令,这些参数本身由脚本构成。
EG。该脚本包含这样的一行
do $opts x y z $more_opts a b c "bit in quotes" $stuff
我想打印出这条线的实际内容。
如果我尝试:
echo 'do $opts x y z $more_opts a b c "bit in quotes" $stuff'
然后我得到$ opts和$ more_opts的字面引用而不是扩展到它们的值。
如果我尝试反击:
echo `do $opts x y z $more_opts a b c "bit in quotes" $stuff`
然后它执行该行本身。
如何生成并打印此字符串的版本,并将$ opts扩展为其值,但未执行?
答案 0 :(得分:3)
最准确的是:
printf '%q ' $opts x y z $more_opts a b c "bit in quotes" $stuff ; echo
因为它会像你的实际命令一样进行单词分词,文件名全局等。 (例如,如果$stuff
为*
,则此版本将正确列出目录中的所有文件,因为这是您的真实命令将执行的操作。)
(向Gordon Davisson提示建议printf
+ %q
,以便重新引用最终结果参数,而不是按原样打印它们。)
但是,更好的方法可能是Jonathan Leffler在上面提出的建议:
(set -x; cmd $opts x y z $more_opts a b c "bit in quotes" $stuff)
它将告诉Bash在运行之前调试打印命令。这样,每次更新实际命令时都不需要更新echo
命令。
答案 1 :(得分:1)
虽然此处列出的解决方案有效,但我强烈建议不要这样做,因为表格的声明
echo myprog $foo $bar $baz
myprog $foo $bar $baz
会产生维护问题:每当您修改myprog ....
行时,您都必须以相同的方式更新echo ....
行。
更好的解决方案是定义一个函数
function echorun {
printf "EXECUTING:" # You can leave this out, if you want to
printf " %q" "$@" # Thank you, Gordon Davisson
echo # Supplying final newline
"$@"
}
并使用
运行您要记录的命令echorun do $opts x y z $more_opts a b c "bit in quotes" $stuff