Что является лучшим способом записать функцию обертки, которая выполняет команды и регистрирует их код выхода

Пока я опаздываю на вечеринку, нужно сказать одно.

Первый параметр устанавливает array1_OfStrings в массив строк

Другой параметр указывает, что array1_OfStrings является массивом строк и затем устанавливает его пустым.

Пока это может быть очень небольшая разница, вы заметите это при компиляции. Для первого варианта компилятор автоматически попытается выяснить, что является типом array1_OfStrings. Второй вариант этого не сделает, вы дадите компилятору понять, что на самом деле это массив строк и сделано.

Почему это важно? Взгляните на следующую ссылку: https://thatthinginswift.com/debug-long-compile-times-swift/

Как вы можете видеть, если вы этого не сделаете объявить тип переменной, которая может повлиять на производительность сборки. LOT.

17
задан Tom Feiner 16 December 2008 в 17:55
поделиться

2 ответа

"$@"

От 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
}
25
ответ дан 30 November 2019 в 12:20
поделиться

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

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

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

7
ответ дан 30 November 2019 в 12:20
поделиться