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

10

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

Linux: 3.2.25

OS 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.

mkaito
источник
Где находится корневой файл? Это независимо от платформы?
Кельвин
Под «корневым файлом» я имею в виду файл, который вы вызываете в оболочке, и который импортирует другие файлы. В моем примере корневым файлом будет script.sh
mkaito
1
Но инициализация входа в bash происходит до запуска скрипта. Слишком поздно запускать «set -x» в скрипте. Попробуйте сами - запустите "bash -l -x script.sh". Вы увидите, что происходит, прежде чем команды вашего скрипта будут выполнены.
Кельвин
С какой стати вы запускаете сценарий bash -l? Это предназначено для интерактивных оболочек. Скрипт не является интерактивной оболочкой.
mkaito
3
Пожалуйста, будьте более непредубежденными - очевидно, создатели bash подумали, что это будет полезно. Я вижу 2 использования (по крайней мере): 1) Вы хотите запустить, ssh user@host 'bash -l -c command'чтобы вы загрузили правильный env. 2) Ты сисадмин и хотите Устранение неполадок , что скрипты инициализации делают , прежде чем ваши прогонов сценария - bash -l -xпокажет вам. Иногда вы хотите знать, где устанавливается переменная env.
Кельвин
0

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

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

Сэм
источник