Каков наилучший способ написать функцию-обертку, которая запускает команды и регистрирует их код выхода - PullRequest
16 голосов
/ 16 декабря 2008

В настоящее время я использую эту функцию для переноса выполнения команд и регистрации их выполнения, а также кода возврата и выхода в случае ненулевого кода возврата.

Однако это проблематично, так как, по-видимому, он выполняет двойную интерполяцию, заставляя команды с одинарными или двойными кавычками разбивать скрипт.

Можете ли вы порекомендовать лучший способ?

Вот функция:

do_cmd()
{
    eval $*
    if [[ $? -eq 0 ]]
    then
        echo "Successfully ran [ $1 ]"
    else
        echo "Error: Command [ $1 ] returned $?"
        exit $?
    fi
}

Ответы [ 2 ]

24 голосов
/ 16 декабря 2008
"$@"

С http://www.gnu.org/software/bash/manual/bashref.html#Special-Parameters:

@

Расширяется до позиционных параметров, начиная с единицы. Когда расширение происходит в двойных кавычках, каждый параметр расширяется до отдельное слово То есть "$ @" эквивалентно "$ 1" "$ 2" .... Если расширение в двойных кавычках происходит в слове, расширение Первый параметр соединяется с начальной частью оригинала слово, а расширение последнего параметра соединяется с последним часть оригинального слова. Когда нет позиционных параметров, «$ @» и $ @ расширяются до нуля (то есть они удаляются).

Это означает, что пробелы в аргументах правильно цитируются.

do_cmd()
{
    "$@"
    ret=$?
    if [[ $ret -eq 0 ]]
    then
        echo "Successfully ran [ $@ ]"
    else
        echo "Error: Command [ $@ ] returned $ret"
        exit $ret
    fi
}
7 голосов
/ 16 декабря 2008

Дополнительно к "$@", что говорит Дуглас, я бы использовал

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

(Таким образом, вы можете обрабатывать сбои и затем корректно завершать работу).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...