Как заставить «bash -x» (режим отладки) рекурсивно входить в исходные скрипты?

Как заставить «bash -x» (режим отладки) рекурсивно входить в исходные скрипты?

Я пытаюсь отладить то, что bash делает при инициализации входа в систему для Linux. Я читал, что "bash -x" заставит bash вывести то, что он делает, но он не выводит команды в исходных файлах, как это делает "set -x". Я не могу использовать "set -x", потому что инициализация выполняется до того, как я могу ее вызвать. "bash -x" кажется нормально рекурсивно работает в OS X, но это может быть из-за версий bash.

Линукс: 3.2.25

ОС X: 3.2.48

Вот отрывок из нерекурсивного поведения в Linux:

bash -l -x -c 'echo 1'
# ... snip ...
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/vim.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/vim.sh
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/which-2.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/which-2.sh
# ... snip ...

Обратите внимание, что /etc/profile.d/vim.sh взят из источника, но его команды не выводятся. Есть ли обходной путь без обновления? Это вызвано разницей в версиях?

решение1

set -xгде-то в корневом файле (тот, который требует все остальные файлы) должно работать. В качестве альтернативы, введите что-то вроде [[ !-z "$DEBUG" ]] && set -xв каждом файле и вызовите с помощью DEBUG=1 script.sh.

решение2

Поскольку вы создаете скрипты, а не выполняете их, вашей первой командой в основном скрипте должна быть «set -x».

Теперь все исходные скрипты будут работать в режиме отладки. Помните, когда вы запускаете исходный скрипт, он запускается в вашей текущей оболочке, поэтому если вы установите -x один раз, это будет работать для всех исходных скриптов.

Связанный контент