Команда Bash «script» в файлах Bash?

Команда Bash «script» в файлах Bash?

У меня есть скрипт 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:

  1. Перенаправить stderr скрипта в файл журнала. Это можно сделать из скрипта с помощью

    # just after shebang
    exec 2>/path/to/logfile
    

    Если myscriptгенерирует вывод на stdout, который важен и фактически куда-то идет (через конвейер или перенаправление), то вы не хотите это нарушать. Но если он обычно печатает на терминале, и вы хотите также это записать в журнал, то перенаправьте и stderr, и stdout в файл журнала:

    # just after shebang
    exec 2>/path/to/logfile 1>&2
    

    Этот метод будет работать даже при myscriptзапуске без терминала.

  2. В качестве альтернативы позвольте скрипту запустить интерактивную оболочку (например, bash) в самом конце. Новая оболочка не даст окну закрыться, и вы сможете увидеть, что скрипт вывел на терминал до сих пор. Для этого, очевидно, требуется терминал. Обратите внимание, если myscriptэто произойдет с самим или exitс другим исполняемым файлом, то он никогда не дойдет до строки с ; примите это во внимание.killexecbash

    Если по какой-то причине интерактив, bashзапущенный из скрипта, очищает терминал или что-то в этом роде, используйте sleep 3600вместо этого. Дело в том, что вам на самом деле не нужна дополнительная оболочка, вам нужен любой процесс, который держит эмулятор терминала открытым достаточно долго, чтобы вы могли изучить предыдущий вывод.

Какой бы метод вы ни выбрали, разместите

set -x

на ранней стадии, myscriptчтобы заставить интерпретирующий его shell выводить команды и их аргументы по мере их выполнения. Это должно дать вам полезную информацию.

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