Sous UNIX, je suis censé écrire un fichier Java qui imprimera "EXIT 1" à l'erreur standard, puis quitter avec un état de 1.
Voici mon approche ..
System.err.println("EXIT 1");
System.exit(1);
C'est ce que je suis censé faire?
Si oui, comment suis-je censé l'utiliser dans les shells Unix? Lorsque je le compile et l'exécute dans le bash, il affiche simplement "EXIT 1" (donc il fait la même chose que System.out.println, pourquoi devrais-je utiliser "err"?). Quelle est "l'erreur standard" ici?
Chaque programme en cours d'exécution a ces trois flux:
System.in
System.out
System.err
Votre programme est correct - il s'imprime sur stderr. Mais dans des circonstances normales, le flux stderr va à la console tout comme le flux stdout, ils ne peuvent donc pas être distingués visuellement.
Cependant, la raison pour laquelle vous devez utiliser stderr au lieu de stdout pour les messages d'erreur est la redirection . Cela signifie que vous envoyez stderr vers un fichier au lieu de la console. Pendant ce temps, stdout ne sera pas affecté, car les deux flux sont indépendants.
Par exemple, vous pouvez le faire dans bash, cmd, PowerShell, etc.:
$ Java Program 2> errors.txt
Maintenant, toutes les sorties avec System.err.println()
finiront dans errors.txt
, Tandis que System.out.println()
ira toujours à l'écran. Cela peut aider au débogage.
Il existe trois flux de données associés à presque tous les processus:
error_log
fichier via stderr
, tandis que le fichier journal normal serait e. g. access_log
.La sortie standard (stdout
) et l'erreur standard (stderr
) sont presque toujours les premier et deuxième flux de sortie provenant d'un processus, respectivement. Cela me permet de faire quelque chose comme /path/to/my/neat/program > logs/program.log 2> logs/program.err
et les sorties et les erreurs sont bien triées.