我正在研究一个shell脚本,该脚本从变量构造一个复杂的命令,例如像这样(使用我从Bash FAQ中学到的技术):
#!/bin/bash
SOME_ARG="abc"
ANOTHER_ARG="def"
some_complex_command \
${SOME_ARG:+--do-something "$SOME_ARG"} \
${ANOTHER_ARG:+--with "$ANOTHER_ARG"}
该脚本动态添加的参数--do-something "$SOME_ARG",并--with "$ANOTHER_ARG"以some_complex_command如果这些变量的定义。到目前为止,一切正常。
但是现在我还希望能够在运行命令时(例如,在调试模式下运行脚本时)打印或记录命令。因此,当我的脚本运行时some_complex_command --do-something abc --with def,我也希望将此命令包含在变量中,以便例如将其记录到syslog中。
Bash FAQ演示了一种用于此目的的DEBUG陷阱和$BASH_COMMAND变量(例如用于调试目的)的技术。我已经尝试使用以下代码:
#!/bin/bash
ARG="test string"
trap 'COMMAND="$BASH_COMMAND"; trap - DEBUG' DEBUG
echo "$ARG"
echo "Command was: ${COMMAND}"
这可行,但是不会在命令中扩展变量:
host ~ # ./test.sh
test string
Command was: echo "$ARG"
我想我必须使用eval扩大echo "$ARG"到echo test string(至少我还没有找到一种方法不eval还)。以下工作正常:
eval echo "Command was: ${COMMAND}"
它产生以下输出:
host ~ # ./test.sh
test string
Command was: echo "$ARG"
Command was: echo test string
但是我不确定我是否可以eval像这样安全地使用。我尝试利用某些东西未成功:
#!/bin/bash
ARG="test string; touch /x"
DANGER='$(touch /y; cat /etc/shadow)'
trap 'COMMAND="$BASH_COMMAND"; trap - DEBUG' DEBUG
echo "$ARG" $DANGER
echo "Command was: ${COMMAND}"
eval echo "Command was: ${COMMAND}"
似乎处理得很好,但是我很好奇是否有人看到我错过的问题。