l'utilisation de </ dev / null & dans la ligne de commande

12

J'ai essayé d'exécuter un exemple de programme java en utilisant la ligne de commande suivante. Cependant, je ne sais pas à quoi sert la partie arrière < /dev/null &?

java   -cp  /home/weka.jar weka.classifiers.trees.J48 t train_file  >& log < /dev/null &
user297850
la source

Réponses:

21

< /dev/nullest utilisé pour envoyer instantanément EOF au programme, afin qu'il n'attende pas d'entrée ( /dev/null, le périphérique nul, est un fichier spécial qui rejette toutes les données qui y sont écrites, mais signale que l'opération d'écriture a réussi et ne fournit aucune donnée à tout processus qui en lit, ce qui donne immédiatement EOF). &est un type spécial de séparateur de commandes utilisé pour mettre en arrière-plan le processus précédent.

Sans connaître le programme appelé, je ne sais pas directement pourquoi il est nécessaire de l'exécuter de cette façon.

Chris Down
la source
6

</dev/nulldéconnecte l'entrée du programme du terminal. Certains programmes réagissent différemment selon ce à quoi leur entrée standard est connectée. Avec la redirection </dev/null, le programme peut dire que son entrée ne provient pas d'un terminal et recevra immédiatement une indication de fin de fichier s'il essaie de lire à partir de son entrée standard.

Le seul &à la fin entraîne l'exécution du programme en arrière-plan. Cela signifie que vous obtenez immédiatement une invite shell. Sans &, vous obtiendrez une invite shell uniquement lorsque le programme aura terminé son exécution.

Notez que le autonome &n'est pas lié à >&. >&est un opérateur de redirection (en tcsh, bash et zsh) qui redirige à la fois la sortie standard du programme et l'erreur standard du programme vers le nom de fichier spécifié après l'opérateur (ici log).

En d'autres termes, ce que fait le shell lorsqu'il voit cette ligne de commande est:

  • Démarrez un processus en arrière-plan. En arrière-plan:
    • Connectez l'entrée standard à /dev/null(le périphérique nul ).
    • Connectez à la fois la sortie standard et l'erreur standard au fichier appelé log(en créant le fichier s'il n'existe pas encore et en le tronquant s'il existe).
    • Recherchez un fichier exécutable appelé javadans le fichier $PATH.
    • Exécuter ce fichier avec les 5 arguments -cp, /home/weka.jar, weka.classifiers.trees.J48, –t, train_file`.
Gilles 'SO- arrête d'être méchant'
la source