$? из скрипта bash команда, выполненная TCL (открытый канал) для windows, возвращает неправильное значение - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть tcl-скрипт с двумя способами выполнения bash скрипт:

#exec bash ./run.sh
open "|bash ./run.sh r"

Скрипт bash показан ниже:

#!/bin/bash
ls
if [ "$?" != "0" ]; then
    echo "ERROR: Status failed!" > status
else
    echo "Everything is OK!" > status
fi

Я использую tcl sh для Windows с bash от git bash. Когда я использую:

exec bash ./run.sh

Я попал в файл состояния:

Все в порядке!

в противном случае :

open "|bash ./run.sh r"

получил:

ОШИБКА: состояние не удалось!

Есть ли возможность правильно определить код выхода когда открыли трубу tcl?

1 Ответ

1 голос
/ 01 марта 2020

Вы не описываете, получаете ли вы другие результаты из ls части скрипта. Это имеет значение; Команда ls наверняка способна изменить свое поведение в зависимости от среды, в которой она вызывается. Это важно, потому что Tcl выполняет подпроцессы (на Windows) напрямую , используя системный вызов CreateProcess(), а не различные упакованные версии, которые используют Cygwin и git bash. Другие возможности заключаются в том, что вы запускаете скрипт в другом каталоге и т. Д.

Однако в целом мы ожидаем, что скрипт будет вести себя очень схожим образом при запуске через exec или через open |… r как они имеют общее ядро ​​функциональности. Единственные различия связаны с тем, как ожидаются выходные данные и завершение.


Если вы создаете конвейер подпроцесса, по умолчанию вы не сможете узнать об ошибках из него, пока вы не close трубопровод. exec генерирует любые ошибки «немедленно», потому что он не возвращает управление вам, пока подпроцесс не завершится и все выходные данные не будут прочитаны.

...