То, что я хотел бы сделать, является взятием как вход к функции, строка, которая может включать кавычки (единственный или двойной) и эхо, что строка точно, поскольку это было предоставлено функции. Например:
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'
.
Я уверен, что это имеет отношение к удару, обрабатывающему аргументы, прежде чем они будут переданы функции; я просто ищу путь вокруг того (если возможный).
Таким образом, то, что я предназначил, было к тени выполнением сценария при обеспечении точной копии выполнения, которое могло использоваться в качестве инструмента диагностики включая статус выхода каждого шага.
В то время как я мог описать желаемое поведение выше путем выполнения чего-то как
while read line ; do
doit ${line}
done < ${INPUT}
Тот подход перестал работать перед лицом управляющих структур (т.е. if
, while
, и т.д.). Я думал об использовании set -x
но это имеет, это - ограничения также: "
становится '
и статус выхода не видим для команд тот сбой.
Причина этого в том, что bash интерпретирует аргументы, как вы думали. При вызове функции кавычек просто больше нет, так что это невозможно. Это работало в DOS, потому что программы могли интерпретировать командную строку сами, а не то, что она вам помогает!
Bash удалит кавычки, если вы передадите строку с кавычкой в качестве аргумента командной строки. Цитаты просто больше не существует, когда строка передается вашему скрипту. У вас нет возможности узнать, есть ли одинарные или двойные кавычки.
Вы, вероятно, можете сделать что-то вроде этого:
doit VAR=42
doit echo \'single quote $VAR\'
doit echo \"double quote $VAR\"
В вашем скрипте вы получите
echo 'single quote $VAR'
echo "double quote $VAR"
Или сделайте это
doit VAR=42
doit echo 'single quote $VAR'
doit echo '"double quote $VAR"'
В вашем скрипте вы получите
echo single quote $VAR
echo "double quote $VAR"
Оболочка будет интерпретировать кавычки и $
, прежде чем передать их вашей функции. Ваша функция мало что может сделать, чтобы вернуть специальные символы, потому что у нее нет возможности узнать (в примере с двойными кавычками), было ли 42
жестко закодировано или получено из переменной. Вам придется избегать специальных символов, если вы хотите, чтобы они выжили достаточно долго, чтобы выполнить вашу функцию.