如何在shell脚本中打印一行shell脚本?

时间:2016-08-12 04:20:48

标签: bash shell

我有一个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扩展为其值,但未执行?

2 个答案:

答案 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