Як зробити так, щоб “bash -x” (режим налагодження) повторювався в джерелах скриптів?


10

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

Linux: 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.


Де знаходиться кореневий файл? Це платформа незалежна?
Келвін

Під "кореневим файлом" я просто маю на увазі файл, який ви викликаєте в оболонці, і який імпортує інші файли. У моєму прикладі кореневим файлом буде script.sh
mkaito

1
Але ініціалізація bash login відбувається перед запуском сценарію. Запустити в сценарії запуск "set -x". Спробуйте самі - запустіть "bash -l -x script.sh". Ви побачите, що відбувається, перш ніж виконувати команди сценарію.
Келвін

Чому на Землі ви б запустили сценарій bash -l? Це призначено для інтерактивних оболонок. Сценарій не є інтерактивною оболонкою.
mkaito

3
Будьте трохи розкритішими - очевидно, творці баш вважали, що це буде корисно. Я бачу 2 використання (принаймні): 1) Ви хочете запустити, ssh user@host 'bash -l -c command'щоб ви завантажили належну env. 2) Ви системний адміністратор і хочете усунути неполадки, що виконують скрипти init до запуску сценарію - bash -l -xпокаже вам. Іноді хочеться знати, де встановлюється змінна env.
Келвін

0

Оскільки ви шукаєте скрипти та не виконуєте, ваша перша команда в головному скрипті має бути "set -x"

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.