2015-03-30 2 views
-2

Мой сценарий содержит следующие наборы на месте:Проверка возврата Grep код

set -o errexit 
set -o pipefail 
set -o nounset 

Теперь я хотел бы уплотнительное Grep (не СЭД, AWK и т.д.) для буквы А в файле Ь, и добавить результат в файл с:

grep A b >> C 

проблема заключается в том, что GREP выходит с RC 1, если нет а не находится в б-файл, который в моем случае это хорошо, поскольку я не вижу, что в качестве вопроса. В этом случае я обернул команду Grep в функции и запуск:

function func_1() { 
    grep A b >> C 
} 

if func_1; then 
    echo "OK" 
else 
    echo "STILL OK" 
end 

Все прекрасно работает, но вскоре я понял, что это было бы неплохо, чтобы поймать RC = 2 (отказ Grep). Как я могу это сделать?

ответ

2

Я не понимаю, как это защищает вас от последствий set -e

Я думаю, вам нужно нужна функция оболочки, отключающий errexit на срок, что-то вроде:

function func_2 { 
    set +o errexit 
    func_1 "[email protected]" 
    rc=$? 
    set -o errexit 
    echo "$rc" 
} 

case $(func_2) in 
    0) echo "success" ;; 
    1) echo "not found" ;; 
    2) echo "trouble in grep-land" ;; 
esac 

Внимательно просматривая документацию для set -e, вы можете обрабатывать команды с ненулевым статусом выхода в определенных ситуациях. Тем не менее, вы можете работать не возврата проверки состояние ненулевой выходы:

#!/bin/bash 
set -o errexit 

function mygrep { 
    local rc=0 
    # on the left side of ||, errexit not triggered 
    grep "[email protected]" >/dev/null || rc=$? 
#  return $rc   # nope, will trigger errexit 
    echo $rc 
} 

echo "test 1: exit status 0" 
mygrep $USER /etc/passwd 

echo "test 2: exit status 1" 
mygrep foobarbaz /etc/passwd 

echo "test 2: exit status 2" 
mygrep $USER /file_does_not_exist 

echo done 

выходы

test 1: exit status 0 
0 
test 2: exit status 1 
1 
test 2: exit status 2 
grep: /file_does_not_exist: No such file or directory 
2 
done 
+0

Отключения что включен не является решением проблемы. Я должен постоянно устанавливать -o errexit –

+0

Тогда вы никогда не сможете защитить себя от ненужного статуса выхода. Не вызывайте grep или diff. –

+0

Я не хочу защищать себя от ненулевого статуса, это не главное. Я хочу знать, как выйти из состояния функции, у которой есть set -o errexit –

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