Есть ли какой-либо механизм в сценарии Shell, как "включить охрану" в C ++? - PullRequest
5 голосов
/ 22 сентября 2011

давайте посмотрим пример: в моем main.sh я хотел бы получить a.sh и b.sh.a.sh, однако, возможно, уже получил b.sh.Таким образом это вызовет коды в b.sh, выполненные дважды.Есть ли какой-нибудь механизм «включения защиты» в C ++?

Ответы [ 3 ]

7 голосов
/ 22 сентября 2011

Если вы используете сценарии-источники, вы обычно используете их для определения функций и / или переменных.

Это означает, что вы можете проверить, был ли сценарий получен ранее, проверяя одну из функцийили переменные, которые он определяет.

Например (в b.sh):

if [ -z "$B_SH_INCLUDED" ]
then
    B_SH_INCLUDED=yes
    ...rest of original contents of b.sh
fi

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

6 голосов
/ 31 июля 2014

В bash ранний возврат не влияет на файл источника, он возвращается к нему, как если бы текущий файл был функцией. Я предпочитаю этот метод, потому что он избегает упаковки всего контента в if...fi.

if [ -n "$_for_example" ]; then return; fi
_for_example=`date`
0 голосов
/ 15 апреля 2017

Лично я обычно использую

set +o nounset # same as set -u

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

#!/usr/bin/env bash

set +u
if [ -n "$PRINTF_SCRIPT_USAGE_SH" ] ; then
    set -u
    return
else
    set -u
    readonly PRINTF_SCRIPT_USAGE_SH=1
fi

Если вы не предпочитаете существительное, вы можетесделай это

[[ -n "$PRINTF_SCRIPT_USAGE_SH" ]] && return || readonly PRINTF_SCRIPT_USAGE_SH=1
...