Возврат при ошибке в сценарии оболочки вместо выхода при ошибке

Я знаю, что эти вопросы и ответы устарели, но FWIW больше не имеет реальной ценности в жестком кодировании вашего ближайшего зеркала в надежде получить максимально быструю производительность.

Если вы используете http://httpredir.debian.org/debian в качестве URL-адреса репо, он автоматически направит вас к лучшему для вас зеркалу (которое не обязательно может быть географически ближайшим).

Прелесть в том, что если новое лучшее зеркало подключится к сети, вы автоматически воспользуетесь им и / или если ваше локальное зеркало отключится, вам не нужно будет обновлять свой sources.list!

Для получения полной информации см. http://httpredir.debian.org/ .

Обратите внимание, что вам все равно нужно использовать security.debian.org для обновлений безопасности!

7
11.09.2016, 16:18
2 ответа

Если вы укажете этот источник, он проигнорирует #! и применит set -e к вызывающей оболочке, поэтому будет применяться ко всем последующим командам.

вы можете принудительно использовать вспомогательную оболочку:

copySomeStuff()
{
    (
        set -e
        source="$1"
        dest="$2"
        cp -r "$source" "$dest"
        return 0
    )
}

Также для безопасности:

  • Не используйте все имена переменных заглавными буквами, так как это может привести к конфликту с именами среды. (на прошлой неделе у нас был вопрос о том, почему скрипт не работает, у него есть переменная PATH)

  • Используйте кавычки.

  • Всегда используйте параметр -t или -T для cp , mv , ln . например

    • cp -t целевой_каталог исходные_файлы…
    • cp -T исходный_файл целевой_файл

    обратите внимание, что -t и -T являются расширениями Gnu и недоступны в некоторых других Unix , поэтому для переносимости вы можете вместо параметра -t сделать:

    • cp source_files… destination_directory /

    Я не знаю альтернативной безопасной формы для -T

4
27.01.2020, 20:17

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

Когда вы используете исходный код из командной строки, «сценарий» фактически становится вашей интерактивной оболочкой. Выход означает завершение сеанса оболочки. Возможно, есть способы обойти это, но лучший вариант, если вы хотите установить errexit для сеанса, будет просто иметь:

#!/bin/bash

set -o errexit

source file_with_functions
do_things_using_functions

Дополнительное преимущество: не будет засорять интерактивный сеанс функциями.

6
27.01.2020, 20:17

Теги

Похожие вопросы