Перейти os.Exit (2) показать bash $?значение 1 - PullRequest
2 голосов
/ 17 апреля 2019

Я написал короткую программу Go, используя os.Exit(2), и запустил ее из оболочки Bash.

Когда я набираю echo $?, отображаются значения 1 независимо от значения выхода, переданного в os.Exit.

Скрипт Bash ниже показывает $? значение 2, как и программа на C.

Почему программа Go всегда показывает значение 1? Как я могу выйти с кодом, отличным от 0 или 1, и должен ли я использовать этот метод для указания различных состояний выхода?

package main

import "os"

func main() {
    os.Exit(2)
}
#!/bin/bash

exit 2
#include <stdlib.h>

int main() {
    exit(2);
}

Ответы [ 2 ]

6 голосов
/ 17 апреля 2019

Статус выхода 1 и 0 - это не статус выхода вашего приложения, а go run.

Если вы запустите свое приложение, используя go run, то go run вернет 0, если ваше приложение вернет 0 статус выхода, и 1, если ваше приложение вернет ненулевой статус (или go run само по себе не получается).

Создайте свое приложение, используя go build или go install, затем запустите приложение напрямую. Тогда вы увидите 2 статус выхода.

Цитирование из Команда go: Скомпилировать и запустить программу Go:

Состояние выхода Run не является состоянием выхода скомпилированного двоичного файла.

Примечание. Если приложение запускается на Go игровой площадке , это также указывает на состояние выхода приложения (без вывода):

Program exited: status 2.

Этот «вопрос» уже поднимался, см. # 13440 . Расс Расс Кокс слова:

Реальный вопрос в том, должен ли 'go run x.go' быть просто интерпретатором для программ Go, например, "python x.py", или это инструмент, который запускает подпроцесс и сообщает о результатах сам, например делать. На сегодняшний день ответом стал последний. Так что не очевидно, что поведение неправильное, если только «go run» не является какой-то интерактивной командой go, а мы уже говорили, что это не так.

И слова Дмитрия Шуралева:

Код выхода - это одномерное значение. При выполнении go run запускаются 2 процесса и 2 кода выхода, которые может потребоваться узнать.

Однако go run может сообщить только одно значение кода выхода, а не два. Невозможно без потерь объединить два кода выхода в один. Если бы он сообщал код выхода программы, в которой он выполнялся дословно, то информация о коде выхода из go run была бы затенена и фактически потерялась.

IMO, если кто-то заботится о точном коде завершения программы, которую он выполняет, он должен собрать его и выполнить самостоятельно. go run - это удобная функция, когда ваши потребности не так требовательны, и у вас все меньше информации, потому что она не может передать больше информации, чем уже делает.

2 голосов
/ 17 апреля 2019

Выполнить программу.Например,

exit.go:

package main

import "os"

func main() {
    os.Exit(2)
}

Вывод:

$ go build exit.go
$ ./exit
$ echo $?
2
$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...