web-dev-qa-db-fra.com

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

sh sys-snap.sh &

Qu'est-ce que sh? Quel est sys-snap.sh? Pourquoi devrais-je mettre & en fin de ligne? Quelqu'un peut-il expliquer la syntaxe?

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

126
user4951

sh est la valeur par défaut Shell compatible Bourne (généralement bash ou dash)

sys-snap.sh est un script Shell, qui contient des commandes que sh exécute. Comme vous ne postez pas son contenu, je ne peux que deviner à partir de 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 actuels, l'utilisation actuelle de la mémoire, l'état de la base de données, etc. Si le script commence par --- ligne Shebang (#!/bin/sh ou similaire), vous pouvez le rendre exécutable avec chmod +x sys-snap.sh et démarrez-le directement en utilisant ./sys-snap.sh s'il se trouve dans le répertoire courant.

Avec & le processus démarre en arrière-plan, vous pouvez donc continuer à utiliser le shell et ne pas avoir à attendre la fin du script. Si vous l'oubliez, vous pouvez arrêter le processus en cours d'exécution avec Ctrl-Z et continuez en arrière-plan avec bg (ou au premier plan avec fg). Pour plus d'informations, voir Contrôle des travaux

99
jofel

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

Vous pouvez voir la liste des travaux en cours d'exécution avec la commande jobs. Vous pouvez revenir à la commande (mettre au premier plan) en utilisant la commande fg. Ce qui ramène la commande à l'état où vous ne voyez aucune invite et vous devez émettre Ctrl-C pour tuer le processus. Vous pouvez cependant suspendre (pause) ce processus, en émettant Ctrl-Z. Cela mettra en pause sys-snap.sh et vous ramène à votre invite. Vous pouvez ensuite le fonder (comme si vous l'aviez émis avec le &) avec la commande bg, et il reprendra à partir de son état de pause Ctrl-Z l'avait mis.

Notez que vous pouvez avoir plus d'un travail à la fois (comme indiqué par jobs):

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

Vous pouvez les mettre en arrière-plan et les mettre en avant-plan à l'aide de leur numéro de travail, %1 sera sys-snap.sh et %2 sera another-script.sh. Si vous utilisez fg ou bg sans arguments, il exécutera la commande sur le travail marqué par + dans la sortie jobs ci-dessus.

fg %1

va mettre sys-snap.sh retour au premier plan, tout en laissant another-script.sh en arrière-plan.

Vous pouvez émettre le Ctrl-C séquence aux travaux en cours d'exécution sans avoir à les mettre en avant-plan avec la commande kill, kill %1 enverra l'équivalent de Ctrl-C à sys-snap.sh.

Si vous utilisez bash Shell, le man bash commande a une section détaillée sous la section intitulée "CONTRÔLE DE TRAVAIL" qui va plus en détail.

Quant au nom de sys-snap.sh, sous unix, les noms de fichiers sont arbitraires (à quelques exceptions près, comme les fichiers du chargeur dynamique). Il n'est pas nécessaire qu'ils aient des extensions de fichier spécifiques pour les faire fonctionner en tant que script Shell, appeler d'autres commandes telles que Perl ou php etc. Il est généralement utilisé pour clarifier les choses, dans ce cas, c'est .sh un Script Shell utilisant le Bourne Shell /bin/sh.

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

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

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

bash: sys-snap.sh: command not found

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

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

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

/bin/sh sys-snap.sh &
93
Drav Sloan

sh est un Shell. Quel Shell dépend exactement du système. Exemple pour un système qui utilise bash comme 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.sh sera un script Shell quelconque, donc sh sys-snap.sh exécutera le script Shell.

& entraînera l'exécution du processus Shell en arrière-plan. Sans pour autant & il restera au premier plan jusqu'à la fin du script. Le script fonctionnera dans les deux cas, il s'agit simplement d'attendre la fin du script ou non avant d'exécuter d'autres commandes.

4
frostschutz

Votre serveur est-il en hostgator?

Le scénario sys-snap.sh est un script spécial écrit par l'équipe hostgator pour collecter tous les fichiers journaux et les données du système, afin qu'ils utilisent sa sortie dans la surveillance et la collecte des informations système.

1
tareq.t