'nounset' удара на подоболочке/ребенке не вынуждает основной сценарий выйти, как к обходному решению это глобально?

Попробуйте этот прием:

man chmod | less +'/a\+x'

или

man chmod | more +'/a\+x'

С обратной косой чертой перед + подпишите потому что, что прибывает после / расширенное регулярное выражение.

3
13.04.2017, 15:36
2 ответа

Мой скрипт был плохо закодирован, но его можно исправить:

Посмотрите на 1-й, 2-й и 3-й комментарии:

  • 1-я ошибка TRAP ERR REQUIRED
  • 2-я ошибка, о которой вы позаботились, не будет поймана в ловушку! не используйте if ! ... предотвратит получение возвращаемого значения с $?
  • 3 И НЕ ДЕЛАЙТЕ ЭХО ДИРЕКТИВНОСТИ, используйте промежуточную переменную, чтобы ошибка могла быть сцеплена

tstNounset. sh:

#!/bin/bash
trap 'ErrorHappened;exit 1' ERR #1st A TRAP ERR IS REQUIRED

set -x 
set -o nounset;set -u

#echo `echo $str`
nRet=0;if strA="`echo $str`";then : ;else nRet=$?;echo "Err$nRet";fi #2rd errors that you take care wont be trapped! do not use `if ! ...` will prevent getting return value with $?
echo "0 - should not reach here?"
strA="`echo $str`";echo "$strA" #3nd DO NOT ECHO DIRECTLY, use a intermediary variable so the error can be cautch
echo "1 - should not reach here?"
function FUNC1() { echo $str; };export -f FUNC1;bash -c FUNC1
function FUNC2() { set -u;echo $str; };export -f FUNC2;bash -c FUNC2
echo "A - should not reach here?"
echo $str
echo "B - doesnt reach here."
0
27.01.2020, 21:23

Подоболочки

Подоболочка не может уничтожить весь скрипт. Под действием set -u подоболочка не имеет возможности сказать своему родителю «эй, я хочу, чтобы вы рассматривали это как фатальную ошибку». В этом даже не было бы смысла, если бы set -u действовал в подоболочке, но не в ее родительской оболочке. Все, что может сделать подоболочка, - это вернуть ненулевой код выхода. Вам решать, обрабатывать этот код выхода в родительском элементе вручную или с помощью set -e .

(set -u; …; echo $undefined_variable)
# here $? is nonzero
ret=$?; if [ $ret -ne 0 ]; then exit $ret; fi

Подпроцессы

То, что вы сделали здесь, не является подоболочкой: вы запускаете другую программу. Этой другой программой оказывается bash, который также является интерпретатором, выполняющим настоящий сценарий, но это совпадение. Нет абсолютно никаких причин, по которым установка в программе, вызванной bash, заставила бы сам bash выйти.

set +e
bash -c 'do something'
echo "A - should and does reach here"

Это ничем не отличается от того, если бы вы написали perl -e 'use strict; print $ barf ' - Perl умрет и вернет ненулевой статус, но это не приведет к завершению работы сценария bash (кроме set -e ). Используйте set -e , если вы хотите выйти, когда подпроцесс возвращает ненулевой код возврата.

3
27.01.2020, 21:23

Теги

Похожие вопросы