l'utilisation de </ dev / null & dans la command line

J'ai essayé d'exécuter un exemple de programme Java en utilisant la command line suivante. Cependant, je ne sais pas quelle est la partie finale < /dev/null & used for?

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

< /dev/null est utilisé pour envoyer instantanément EOF au programme, de sorte qu'il n'attend pas d'input ( /dev/null , le périphérique null est un file spécial qui supprime toutes datatables écrites, mais signale que le opération d'écriture réussie, et ne fournit aucune donnée à un process qui lit à partir de lui, cédant EOF immédiatement). & est un type spécial de séparateur de commands utilisé pour fonder le process 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.

</dev/null déconnecte l'input du programme du terminal. Certains programmes réagissent différemment en fonction de la connection de leur input standard. Avec la redirection </dev/null , le programme peut dire que son input ne provient pas d'un terminal et recevra une indication de fin de file immédiatement s'il essaie de lire à partir de son input standard.

Le seul & à la fin provoque l'exécution du programme en arrière-plan. Cela signifie que vous obtenez immédiatement une invite de shell. Sans le & , vous obtiendrez une invite shell uniquement lorsque le programme aura fini de s'exécuter.

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

En d'autres termes, ce que le shell fait quand il voit cette command line est:

  • Démarrer un process en arrière-plan. Dans le process d'arrière-plan:
    • Connectez l'input standard à /dev/null (le périphérique nul ).
    • Connectez la sortie standard et l'erreur standard au file appelé log (en créant le file s'il n'existe pas encore et en le tronquant s'il existe).
    • Recherchez un file exécutable appelé java dans le $PATH .
    • Exécutez ce file avec les 5 arguments /home/weka.jar , weka.classifiers.trees.J48 , weka.classifiers.trees.J48 , –t , train_file`.