Я працюю над сценарієм оболонки, який будує складну команду із змінних, наприклад, як це (з технікою, яку я навчився з FAQ Bash ):
#!/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}"
Здається, це добре вдається, але мені цікаво, якщо хтось інший побачить проблему, яку я пропустив.