%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%BE%20%D0%B2%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%8C%20%D0%B2%20%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B5%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B%3F.png)
Я пытаюсь отладить то, что 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 один раз, это будет работать для всех исходных скриптов.