Que signifie esperluette à la fin d'une ligne de script shell?

118
sh sys-snap.sh &

C'est quoi sh? C'est quoi sys-snap.sh? Pourquoi je devrais mettre &au bout de la ligne? Quelqu'un peut-il expliquer la syntaxe?

Sans le &script, le message ne reviendra pas à l'invite tant que je n'aurai pas appuyé sur Ctrl+ C. Avec &je peux appuyer sur entrer et ça marche.

utilisateur4951
la source
2
la double esperluette est-elle &&différente d'une seule esperluette &?
Charlie Parker
1
@ CharlieParker Avez-vous déjà trouvé une réponse à cette question? J'essaie de comprendre la différence moi-même. (Edit: Nevermind, trouvé plus bas)
Drazen Bjelovuk

Réponses:

94

shest le shell compatible Bourne par défaut (généralement bash ou dash)

sys-snap.shest un script shell, qui contient des commandes qui shs'exécutent. Comme vous ne postez pas son contenu, je ne peux que deviner par son nom ce qu’il fait. Je peux trouver un script lié à CPanel avec le même nom de fichier, qui crée un fichier journal avec tous les processus en cours, l'utilisation actuelle de la mémoire, l'état de la base de données, etc. Si le script commence par une ligne shebang ( #!/bin/shou similaire), vous pouvez le rendre exécutable. avec chmod +x sys-snap.shet démarrez-le directement en utilisant ./sys-snap.shs’il se trouve dans le répertoire en cours.

Avec &le processus commence en arrière-plan, vous pouvez donc continuer à utiliser le shell sans avoir à attendre que le script soit terminé. Si vous l'oubliez, vous pouvez arrêter le processus en cours avec Ctrl-Zet le poursuivre en arrière-plan avec bg(ou au premier plan avec fg). Pour plus d'informations, voir Contrôle du travail.

jofel
la source
4
shgénéralement bashou uniquement dashsur des systèmes Linux (ou OS / X récents). Sur les BSD, il s’agit généralement d’une autre variante de Ash (dash est basé sur NetBSD sh, lui-même basé sur le shell d’Almquist) ou sur un dérivé de pdksh. Sur les Unices commerciaux, il s’agit généralement de ksh88.
Stéphane Chazelas
1
@ jofel: Que se passe-t-il si le script ci-dessous est en cours d'exécution et que, par erreur, j'ai exécuté Ctrl-C. Mon script sera-t-il exécuté ou sera-t-il terminé? Ex: sh sys-snap.sh &
Hussain7
2
@ Hussain7 Ctrl-C est toujours envoyé au processus en cours au premier plan. Si le script shell est démarré avec &et donc en arrière-plan, vous obtenez uniquement une nouvelle invite du shell.
Jofel
2
la double esperluette est-elle &&différente d'une seule esperluette &?
Charlie Parker
7
@CharlieParker Oui, "&&" est la fonction "et". La commande after && est appelée uniquement lorsque la commande before réussit. L'exemple "true && echo works" "output" fonctionne, mais "false && echo no output" n'appelle pas la fonction echo.
jofel
87

Ceci est connu sous le nom job controlunix. Il &informe le shell de mettre la commande en arrière-plan. Cela signifie qu'il continue à exécuter la sys-snap.shcommande mais vous ramène à votre shell pour vous permettre de continuer à exécuter des commandes parallèles.

Vous pouvez voir la liste des tâches en cours d'exécution avec la jobscommande. Vous pouvez revenir à la commande (mettre au premier plan) en utilisant la fgcommande. Ce qui ramène la commande à l'état où vous ne voyez aucune invite et vous devez émettre Ctrl- Cpour tuer le processus. Vous pouvez cependant suspendre (mettre en pause) ce processus en lançant Ctrl- Z. Cela fera une pause sys-snap.shet vous ramènera à votre invite. Vous pouvez ensuite fond (comme si vous aviez publié ce avec le &) avec la bgcommande, et il repreniez en cours d' exécution à partir de son état , le mis en pause Ctrl- Zil avait mis.

Notez que vous pouvez avoir plusieurs emplois à la fois (comme indiqué par jobs):

[1]-  Running          sys-snap.sh &
[2]+  Running          another-script.sh &

Vous pouvez arrière - plan et de premier plan en les utilisant leur numéro de travail, %1vous serez sys-snap.shet %2serez another-script.sh. Si vous utilisez fgou bgsans arguments, la commande sera exécutée sur le travail marqué par +dans le jobsrésultat ci-dessus.

fg %1

sera remis sys-snap.shau premier plan, tout en laissant another-script.shà l'arrière-plan.

Vous pouvez utiliser la séquence Ctrl- Cpour exécuter des tâches sans avoir à les mettre en avant avec la killcommande, vous kill %1enverrez l'équivalent de Ctrl- Cà sys-snap.sh.

Si vous utilisez bash shell, la man bashcommande comporte une section détaillée dans la section intitulée "CONTRÔLE DES TRAVAUX" pour aller plus en détail.

En ce qui concerne le nom de sys-snap.sh, les noms de fichiers sous unix sont arbitraires (à quelques exceptions près, comme les fichiers de chargeur dynamique). Il n'y a pas d' obligation pour eux d'avoir extentions de fichiers spécifiques pour les faire fonctionner comme un script shell, appeler d' autres commandes telles que perlou phpetc. Il est généralement utilisé pour fournir la clarté, que dans ce cas, il est .shun script shell en utilisant le Bourne Shell /bin/sh.

La partie fonctionnelle de sys-snap.sh(quand vous regardez son contenu avec quelque chose comme la lesscommande) est le Shebang . Sur la première ligne, vous trouverez probablement l'un des suivants:

#! /bin/sh
#! /bin/bash
#! /usr/local/bin/bash

ou similaire. En termes simples, une commande après le #!(telle que /bin/sh) est exécutée et le contenu du reste du fichier de script lui est transmis ligne par ligne. Notez que le fichier doit également être défini comme exécutable chmodpour que vous puissiez l'exécuter en tant que commande. Si les autorisations n'étaient pas définies, alors le shebangn'a aucun effet, car vous obtiendriez soit l'erreur:

bash: sys-snap.sh: command not found

ou si vous l'avez exécuté par chemin explicite ./sys-snap.sh( .c'est-à-dire le répertoire de travail actuel), vous obtiendrez:

bash: ./sys-snap.sh: Permission denied

L'autre alternative est de le laisser sans les autorisations d'exécution et de demander explicitement à / bin / sh de l'exécuter:

/bin/sh sys-snap.sh &
Drav Sloan
la source
3
C'est une excellente réponse. Une suggestion possible est également d'ajouter ce nohupque cela signifie, car il est souvent utilisé conjointement avec &pour démarrer un processus et être capable de tuer le shell qui l'a lancé sans tuer le processus.
Tommy
@Drav, Est-il vrai que jobscela retournera toujours vide si c'est la première commande?
Pacerier
Notez que l'utilisation &à la fin d'une commande ne fait que détacher stdin(mais pas stdoutou stderr) ce qui implique que si votre commande / script s'exécute en arrière-plan mais écrit dans stdout, vous risquez de vous retrouver dans une situation où Ctrl + cla sortie ne s'arrêtera pas mais vous pourrez taper des commandes. En effet, le processus d'arrière-plan écrit sur stdoutmais vous ne pouvez pas l'arrêter car il ne s'exécute pas au premier plan. Plus d'infos ici .
vadasambar
4

shest une coquille. Quel shell dépend exactement du système. Exemple pour un système utilisant bashcomme shell standard:

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 13 16:12 /bin/sh -> bash

$ sh --version
GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu)

sys-snap.shsera un script shell, donc sh sys-snap.shexécutera le script shell.

&provoquera l'exécution du processus shell en arrière-plan. Sans &cela, il restera au premier plan jusqu'à la fin du script. Le script fonctionnera dans les deux cas. Il suffit d'attendre que le script se termine ou non avant d'exécuter d'autres commandes.

Frostschutz
la source
1

Votre serveur est-il en hostgator?

Le script sys-snap.shest un script spécial écrit par l'équipe hostgator pour collecter tous les fichiers journaux et les données du système. Il utilise donc sa sortie pour surveiller et collecter les informations système.

tareq.t
la source
Non, je n'utilise pas hostgator.
user4951
1
@ J.Chang Le script fait partie de cPanel utilisé par Hostgator et des centaines d'autres hôtes.
472084
@ 472084, quelle version de cpanel?
Pacerier