То, что я хотел бы сделать, это взять в качестве входных данных для функции строку, которая может включать кавычки (одинарные или двойные) и отображать эту строку в точности так, как она была предоставлена функции.Например:
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 аргументов перед их передачей в функцию;Я просто ищу способ обойти это (если возможно).
Редактировать
Итак, я хотел скрыть выполнение сценария, предоставляя точную копию выполнения, которая могла бы использоваться в качестве диагностического инструмента, включая состояние завершения каждого шага.
В то время как я могу получить желаемое поведение, описанное выше, выполнив что-то вроде
while read line ; do
doit ${line}
done < ${INPUT}
Этот подход терпит неудачу перед лицом управляющих структур (то есть if
, while
, так далее).Я думал об использовании set -x
, но у него также есть свои ограничения: "
становится '
и состояние выхода не отображается для команд, которые не работают.