2015-11-23 3 views
4

Может быть основной вопрос, но я не знаю, почему каротаж может вызвать эту функцию выхода, чтобы не работать, как ожидалось:Почему этот скрипт bash не выходит?

#!/bin/bash 

function exitFunct 
{ 
    exit 1 
} 

exitFunct 2>&1 | tee -a /var/tmp/output.txt 
echo "You should never see this" 

Но выход «Вы никогда не должны видеть это»

ответ

7

Как man bash объясняет,

Каждая команда в конвейере выполняется как отдельный процесс (то есть в подоболочке).

Таким образом, функция exit в функции выходит за пределы подоболочки, которая выполняет функцию функции конвейера.

А также,

Возвращение состояния трубопровода является статус выхода последней команды, если опция pipefail не включена.

Таким образом, вы можете изменить поведение, предваряя

set -eo pipefail 

к сценарию (-e делает вашу остановку сценария на ошибку). Тем не менее, обратите внимание, что использование exit 0 не закончило бы это.

+0

Это означает, что 'exit' в функции выходит из порожденной конвейером суб-оболочки, а не родительской оболочки. (Просто для того, чтобы сделать это ясно.) –

+0

@wizurd: Если вы не хотите, чтобы 'grep' заканчивал скрипт, обрабатывайте его в or:' grep ... || echo Ничего не найдено' – choroba

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