Comment appeler des commandes shell depuis Ruby ?

Créé le 08 Dec 2022 - Mis à jour le 04 Jul 2023 - Créé par Fabien Berthoux - ruby

Appeler des commandes shell depuis Ruby est assez simple et peut être fait à l’aide de la méthode Kernel#system. La méthode system prend une chaîne de caractères qui est la commande shell que vous souhaitez exécuter. La méthode system retourne true si la commande s’est terminée avec succès et false si une erreur s’est produite.

Par exemple, la commande suivante exécute la commande ls dans le répertoire courant:

system('ls')

Il existe également une méthode Kernel#exec qui peut être utilisée pour appeler des commandes shell. La méthode exec est similaire à system, à la différence qu’elle ne retourne jamais et remplace le processus Ruby par le processus shell.

Par exemple, la commande suivante exécute la commande ls dans le répertoire courant et remplace le processus Ruby par le processus ls:

exec('ls')

Il est également possible d’utiliser des variables dans les commandes shell en les entourant de guillemets simples et en les précédant d’un signe dollar. La chaîne de caractères sera alors remplacée par la valeur de la variable.

Par exemple, la commande suivante exécute la commande ls dans le répertoire spécifié par la variable dir:

dir = '/path/to/directory'
system("ls #{dir}")

Quelle méthode utiliser pour appeler des commandes shell depuis Ruby ?


Il existe deux méthodes principales pour exécuter des commandes shell depuis Ruby: Kernel#system et Kernel#exec. La méthode system prend une chaîne de caractères qui est la commande shell à exécuter et retourne true si la commande s’est terminée avec succès et false si une erreur s’est produite. La méthode exec est similaire à system, à la différence qu’elle ne retourne jamais et remplace le processus Ruby par le processus shell.

Est-il possible d’utiliser des variables dans les commandes shell exécutées depuis Ruby ?


Oui, il est possible d’utiliser des variables dans les commandes shell exécutées depuis Ruby. Pour ce faire, il suffit d’entourer le nom de la variable de guillemets simples et de le précéder d’un signe dollar. La chaîne de caractères sera alors remplacée par la valeur de la variable. Par exemple:

dir = '/path/to/directory'
system("ls #{dir}")

Comment exécuter des commandes shell en arrière-plan depuis Ruby ?


Il est possible d’exécuter des commandes shell en arrière-plan depuis Ruby en ajoutant un caractère & à la fin de la commande. Par exemple, la commande suivante exécutera la commande ls en arrière-plan:

system('ls &')

Est-il possible de récupérer le résultat d’une commande shell exécutée depuis Ruby ?


Oui, il est possible de récupérer le résultat d’une commande shell exécutée depuis Ruby en utilisant la méthode Kernel#backtick ou la méthode Kernel#open. La méthode backtick retourne une chaîne contenant le résultat de la commande et la méthode open retourne un objet IO.

Par exemple, la commande suivante retournera une chaîne contenant le résultat de la commande ls:

result = `ls`

Est-il possible d’exécuter des commandes shell conditionnellement depuis Ruby ?


Oui, il est possible d’exécuter des commandes shell conditionnellement depuis Ruby en utilisant la méthode Kernel#system. La méthode system accepte deux arguments optionnels, un pour le code de sortie et un pour le code d’erreur. Si la commande est exécutée avec succès et que le code de sortie est égal au code d’erreur spécifié, la méthode system retournera true, sinon elle retournera false.

Par exemple, la commande suivante exécutera la commande ls et retournera true si la commande s’est terminée avec le code de sortie 0 et false si elle s’est terminée avec un autre code de sortie:

system('ls', 0)