То, что я хотел бы сделать, это взять в качестве функции функции строку, которая может включать в себя кавычки (одиночные или двойные) и эхо-строку, точно так же, как она была предоставлена функции. Например:
function doit {
printf "%s " ${@}
eval "${@}"
printf " # [%3d]\n" ${?}
}
Что, учитывая следующий ввод
doit VAR=42
doit echo 'single quote $VAR'
doit echo "double quote $VAR"
Допускается следующее:
VAR=42 # [ 0]
echo single quote $VAR # [ 0]
echo double quote 42 # [ 0]
Таким образом, семантика расширения переменной сохраняется, как я ожидал, но я не могу получить точный формат строки, как она была предоставлена функции. Я хотел бы получить doit echo 'single quote $VAR'
результат echo 'single quote $VAR'
.
Я уверен, что это связано с bash обработкой аргументов, прежде чем они будут переданы функции; Я просто ищу способ обойти это (если возможно).
Изменить
Итак, я намеревался затенять выполнение script, предоставляя точную копию выполнения, которое может быть использовано в качестве диагностического инструмента, включая статус выхода на каждом шаге.
Пока я могу получить желаемое поведение, описанное выше, сделав что-то вроде
while read line ; do
doit ${line}
done < ${INPUT}
Этот подход выходит из строя перед структурами управления (т.е. if
, while
и т.д.). Я думал об использовании set -x
, но у него тоже есть ограничения: "
становится '
, а статус выхода не отображается для команд, которые не работают.