Попробуйте этот прием:
man chmod | less +'/a\+x'
или
man chmod | more +'/a\+x'
С обратной косой чертой перед +
подпишите потому что, что прибывает после /
расширенное регулярное выражение.
Мой скрипт был плохо закодирован, но его можно исправить:
Посмотрите на 1-й, 2-й и 3-й комментарии:
if ! ...
предотвратит получение возвращаемого значения с $?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."
Подоболочка не может уничтожить весь скрипт. Под действием 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
, если вы хотите выйти, когда подпроцесс возвращает ненулевой код возврата.