Я понимаю, что dash
- это "модельная" оболочка - она была написана недавно и хорошо, и она реализует только то, что требуется от оболочки POSIX. Я посмотрел на исходный код тире, чтобы понять, как выполняется "трассировка" такой программы, как shell.
"Отслеживание" дефиса выполняется путем его компиляции с определенным DEBUG
и вызова -o debug
. Когда вы делаете это, открывается файл trace
с fopen
в который выводится информация о том, что делает dash
при запуске.
За исключением всего механизма, как мне кажется, не работает даже в этой "отлично написанной" оболочке. Если у меня есть это в сценарии оболочки:
exec 3>&1
сразу вся информация после этого, скорее всего, больше не будет выгружаться в trace
файла, но переходит на стандартный stdout
. Это потому, что fopen
вызывает open
и это, вероятно, возвращает дескриптор файла 3.
Это не надуманный пример. Существуют широко используемые сценарии реального мира, в которых есть такие строки, как
номер exec
>&1
(Я видел, что в 2 autotools configure
скрипты: для программного обеспечения IP Infusion и Kerberos).
Итак, как можно отладить / отследить оболочку, когда она должна запускать подобные сценарии?
(Я не ищу инструменты вне оболочки - я хочу знать, как правильно отслеживать трассировку внутри такой программы, как оболочка. Или это вообще не возможно?)