2017-01-11 2 views
2

У меня есть потребность в группу команд, используя фигурные скобки в моем сценарии оболочки, так что я могу направить свою продукцию, чтобы отделить файлы журналов, как так ...Как выйти из сценария оболочки bash изнутри фигурных скобок?

>cat how-to-exit-script-from-within-curly-braces.sh 

{ 
    printf "%d\n" 1 
    printf "%d\n" 2 
} | tee a.log 
{ 
    printf "%d\n" 3 
    printf "%d\n" 4 
} | tee b.log 

    >./how-to-exit-script-from-within-curly-braces.sh 
1 
2 
3 
4 
    >cat a.log 
1 
2 
    >cat b.log 
3 
4 
    > 

Хотя я добавил фигурный приготовился, чтобы облегчить ведение журнала, Мне все равно хотелось бы, чтобы скрипт вышел, когда вызывается команда exit внутри фигурных скобок.

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

>cat how-to-exit-script-from-within-curly-braces.sh 

{ 
    printf "%d\n" 1 
    exit 
    printf "%d\n" 2 
} | tee a.log 
{ 
    printf "%d\n" 3 
    printf "%d\n" 4 
} | tee b.log 

    >./how-to-exit-script-from-within-curly-braces.sh 
1 
3 
4 
    >cat a.log 
1 
    >cat b.log 
3 
4 
    > 

делает код выхода ненулевым и добавление «набор -e», чтобы скрипт не появляется на работу ...

>cat how-to-exit-script-from-within-curly-braces.sh 
set -e 

{ 
    printf "%d\n" 1 
    exit 1 
    printf "%d\n" 2 
} | tee a.log 
{ 
    printf "%d\n" 3 
    printf "%d\n" 4 
} | tee b.log 

    >./how-to-exit-script-from-within-curly-braces.sh 
1 
3 
4 
    >cat a.log 
1 
    >cat b.log 
3 
4 
    > 

Есть ли способ принудительно выйти из сценария изнутри фигурных скобок?

+1

Хороший Q, за исключением смайликов (я чувствую сварливость; ->), но не был уверен, что S.O. теперь преобразовывал какой-то ошибочный синтаксис вашего синтаксиса в смайлик. Всем удачи! – shellter

ответ

5

Там нет никаких проблем с exit и фигурными скобками:

{ 
    exit 
} 
echo "This will never run." 

Однако, есть проблема с exit и трубами, и это то, что вы работаете в:

exit | exit 
echo "Still alive" 

В Баше по умолчанию каждый этап в конвейере выполняется в подоболочке, а exit может выйти из этой подоболочки. В вашем случае, вы можете использовать перенаправление и процесс замены вместо:

{ 
    printf "%d\n" 1 
    exit 1 
    printf "%d\n" 2 
} > >(tee a.log) 
echo "This will not run" 

Заметьте, что это Баш конкретный код, и не будет работать в sh (например, при использовании #!/bin/sh или sh myscript). Вместо этого вы должны использовать bash.

+0

который работал красиво. очень информативно. спасибо –

+1

FYI ... «set -o pipefail», похоже, тоже работает. «используется для распространения ошибок, так что возвращаемое значение команды конвейера отличное от нуля, если одна из предыдущих команд вышла с ненулевым статусом» http://stackoverflow.com/a/19622300/2341218 –

Смежные вопросы