Назад | Перейти на главную страницу

Как я могу применить «shopt -s extdebug» к моей оболочке по умолчанию?

Я пытаюсь создать средство проверки перед запуском в 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

Что я делаю не так и как я могу выполнить это в .bashrc (мне нужно выполнять его каждый раз, когда пользователь входит в систему)?

ОК, разобрался с ответом.

    set -o functrace > /dev/null 2>&1

требуется (в дополнение к shopt -s extdebug), чтобы функциональность работала в суб-оболочках. И как-то .bashrc рассматривается как супероболочка реальной интерактивной оболочки, в некотором смысле, если вы не добавите ее, это не повлияет на интерактивную командную строку.

Итак, вам нужно добавить обе команды в .bashrc