То, что я хотел бы сделать, это взять в качестве функции функции строку, которая может включать в себя кавычки (одиночные или двойные) и эхо-строку, точно так же, как она была предоставлена функции. Например:
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, но у него тоже есть ограничения: " становится ', а статус выхода не отображается для команд, которые не работают.