Каков наилучший способ написать функцию-обертку, которая запускает команды и регистрирует их код выхода
В настоящее время я использую эту функцию для переноса исполняемых команд и регистрации их выполнения, а также возврата кода и выхода в случае ненулевого кода возврата.
Однако это проблематично, поскольку, по-видимому, он выполняет двойную интерполяцию, делая команды с одинарными или двойными кавычками в них, разбивая script.
Можете ли вы порекомендовать лучший способ?
Здесь функция:
do_cmd()
{
eval $*
if [[ $? -eq 0 ]]
then
echo "Successfully ran [ $1 ]"
else
echo "Error: Command [ $1 ] returned $?"
exit $?
fi
}
Ответы
Ответ 1
"[email protected]"
Из http://www.gnu.org/software/bash/manual/bashref.html#Special-Parameters:
@
Расширяется до позиционных параметров, начиная с одного. Когда расширение происходит в двойных кавычках, каждый параметр расширяется до отдельное слово. То есть, "$ @" эквивалентно "$ 1" "$ 2".... Если двойное кавычное расширение происходит внутри слова, расширение первый параметр соединяется с начальной частью оригинала слово, а расширение последнего параметра соединяется с последним часть оригинального слова. Когда нет позиционных параметров, "$ @" и [email protected]развернуть до нуля (т.е. удаляются).
Это означает, что пробелы в аргументах повторно цитируются правильно.
do_cmd()
{
"[email protected]"
ret=$?
if [[ $ret -eq 0 ]]
then
echo "Successfully ran [ [email protected] ]"
else
echo "Error: Command [ [email protected] ] returned $ret"
exit $ret
fi
}
Ответ 2
Дополнительно к "[email protected]"
, что говорит Дуглас, я бы использовал
return $?
И не exit
. Это приведет к выходу из вашей оболочки вместо возврата из функции. Если в случаях, когда вы хотите выйти из оболочки, если что-то пошло не так, вы можете сделать это в вызывающем:
do_cmd false i will fail executing || exit
# commands in a row. exit as soon as the first fails
do_cmd one && do_cmd && two && do_cmd three || exit
(Таким образом, вы можете обрабатывать сбои, а затем выйти изящно).