Я пытаюсь создать средство проверки перед запуском в bash (используя bash-preexec.sh
)
Чтобы не выполнить команду при сбое перехватчика pre-exec, мне нужно запустить shopt -s extdebug
(который не выполняет команду, когда команда trap DEBUG возвращает ненулевой RC).
Если я сбегу shopt -s extdebug
в моей оболочке в качестве команды это работает отлично (программа проверки preexec просто запросила "OK" в файле, содержащем слово "FAIL", поэтому команда не должна выполняться):
> grep shopt .bashrc
> bash
bash-4.1$ echo TEST2
TEST2 <=== Expected, since I didn't turn on extdebug yet
bash-4.1$ shopt -s extdebug > /dev/null 2>&1
bash-4.1$ echo TEST2
bash-4.1$ # WHAT WAS EXPECTED. Command failed to execute.
Однако, когда я добавляю команду в свой .bashrc, она не действует:
> grep shopt .bashrc
shopt -s extdebug > /dev/null 2>&1
> bash
bash: /usr/share/bashdb/bashdb-main.inc: No such file or directory
bash: warning: cannot start debugger; debugging mode disabled
bash-4.1$ echo TEST2
TEST2
ОК, разобрался с ответом.
set -o functrace > /dev/null 2>&1
требуется (в дополнение к shopt -s extdebug
), чтобы функциональность работала в суб-оболочках. И как-то .bashrc
рассматривается как супероболочка реальной интерактивной оболочки, в некотором смысле, если вы не добавите ее, это не повлияет на интерактивную командную строку.
.bashrc