2014-11-26 3 views
-1

У меня есть функция Bash, которая имеет Perl-стиль «или умереть». Например,Как я могу вызвать функцию Bash без вызова подстановки команды?

#!/bin/bash 
func1() { 
    local val 
    val=`cat foobar` || exit 7 
    echo "func1: cat returns $?" 
} 

myval=`func1` 
echo "Line X should not be reached (retn = $? val = $myval)" 
myval=$(func1) 
echo "Line Y should not be reached (retn = $? val = $myval)" 
func1 
echo "Line Z should not be reached (retn = $?)" 

Вызов функции непосредственно давайте мне рычаги exit. Но если функция возвращает значение, которое я хочу использовать, замена команды не работает с exit. То есть, выход просто сохраняется в возвращаемом значении $? и выполняется следующая строка.

Запуск с опцией отладки -x, по-видимому, подразумевает, что подстановка команд похожа на подоболочку, поскольку bash выводит на нее более глубокое вложение. Таким образом, exit не относится к основному скрипту. Выход

Примера:

cat: foobar: No such file or directory 
Line X should not be reached (retn = 7 val =) 
cat: foobar: No such file or directory 
Line Y should not be reached (retn = 7 val =) 
cat: foobar: No such file or directory 

Есть ли способ, чтобы вызвать func1 и использовать свой выход (в переменном, петле, если, и т.д.) в том же время усиливая короткое замыкание exit?

+1

Короткий ответ: Нет, вы не можете сделать оба сразу. –

+1

Использовать 'return 1' вместо' exit' –

+0

Подстановка команды не похожа на подоболочку; он явно создает подоболочку для запуска данной команды. – chepner

ответ

0

Вы можете использовать этот простой код обработчика SIGHUP сигнала включен, он отлично работает, как вы хотите :)

hndlHUP() { 
    exit 7 
} 
func1() { 
    local val 
    val=$(cat foobar) || kill -SIGHUP $$ 
    echo "func1: cat returns $?" 
} 

trap hndlHUP SIGHUP 

myval=`func1` 
echo "Line X should not be reached (retn = $? val = $myval)" 
myval=$(func1) 
echo "Line Y should not be reached (retn = $? val = $myval)" 
func1 
echo "Line Z should not be reached (retn = $?)"