
У меня есть скрипт bash, /usr/bin/local/myscript. Я обычно запускаю файл из внешнего программного обеспечения (в моем случае Autohotkey), в основном я имею в виду, что скрипт будет завершен немедленно, а окно закроется, поэтому я не смогу увидеть никаких журналов в окне, журналов информации или журналов ошибок. Поэтому мне нравится «скриптовать» все выполняемые шаги для отладки, когда программа работает некорректно. Но простое добавление a script ~/script.txt
в начало файла myscript
не сработало, я не знаю, что происходит, следующие строки в файле в основном не выполнялись. Итак, есть ли (правильный) способ использовать «script» в файлах bash или лучшая альтернатива «script» для этого?
решение1
Но простое добавление a
script ~/script.txt
в начало файлаmyscript
не сработало, я не знаю, что происходит, следующие строки в файле по сути не выполняются.
Для интерпретатора оболочки myscript
, script ~/script.txt
это просто команда, которая запускает внешний исполняемый файл. Исполняемый файл script
в данном случае.
Если бы исполняемый файл был sleep
, tar
или ls
, можно было бы ожидать, что оболочка будет ждать завершения исполняемого файла, прежде чем интерпретировать оставшуюся часть myscript
. С script
этим нет разницы: оболочка ждет script
завершения.
script
предназначен для интерактивного использования. script ~/script.txt
запускает интерактивную оболочку, которая не является оболочкой, интерпретирующей myscript
. Вы написали "окно закрывается" (без script
), поэтому я предполагаю, myscript
что запускается в каком-то эмуляторе терминала, который отображает окно. Если так, то (с script
) вы, вероятно, видели, как эта внутренняя оболочка была запущена script
и могли взаимодействовать с ней, пока внешняя оболочка ждала. script
регистрирует то, что вы делаете во внутренней оболочке. Выход из внутренней оболочки завершается script
, и только тогда внешняя оболочка (т. е. myscript
) продолжается. Но, возможно, вы закрыли эмулятор терминала, внешняя оболочка получила SIGHUP и больше не продолжила работу.
Это не важно, так как теперь должно быть ясно, script
что вызов изнутри myscript
не может помочь вам с отладкой myscript
, даже если внешняя оболочка продолжает работу.
Существует как минимум два метода отладки myscript
:
Перенаправить stderr скрипта в файл журнала. Это можно сделать из скрипта с помощью
# just after shebang exec 2>/path/to/logfile
Если
myscript
генерирует вывод на stdout, который важен и фактически куда-то идет (через конвейер или перенаправление), то вы не хотите это нарушать. Но если он обычно печатает на терминале, и вы хотите также это записать в журнал, то перенаправьте и stderr, и stdout в файл журнала:# just after shebang exec 2>/path/to/logfile 1>&2
Этот метод будет работать даже при
myscript
запуске без терминала.В качестве альтернативы позвольте скрипту запустить интерактивную оболочку (например,
bash
) в самом конце. Новая оболочка не даст окну закрыться, и вы сможете увидеть, что скрипт вывел на терминал до сих пор. Для этого, очевидно, требуется терминал. Обратите внимание, еслиmyscript
это произойдет с самим илиexit
с другим исполняемым файлом, то он никогда не дойдет до строки с ; примите это во внимание.kill
exec
bash
Если по какой-то причине интерактив,
bash
запущенный из скрипта, очищает терминал или что-то в этом роде, используйтеsleep 3600
вместо этого. Дело в том, что вам на самом деле не нужна дополнительная оболочка, вам нужен любой процесс, который держит эмулятор терминала открытым достаточно долго, чтобы вы могли изучить предыдущий вывод.
Какой бы метод вы ни выбрали, разместите
set -x
на ранней стадии, myscript
чтобы заставить интерпретирующий его shell выводить команды и их аргументы по мере их выполнения. Это должно дать вам полезную информацию.