39 votes

Pourquoi combiner des commandes sur une seule ligne dans un script Bash ?

Je suis novice en matière de Linux et de script Bash. Au travail, j'ai vu des scripts avec des constructions similaires à celle-ci :

mkdir build && cd build && touch blank.txt

Ou bien :

mkdir build; cd build; touch blank.txt

Ou même l'exotique :

COMMAND="mkdir build && cd build && touch blank.txt"
eval ${COMMAND}

Le dernier exemple donne un cas d'utilisation possible où une seule ligne pourrait être utile, mais généralement ce qui suit est plus facile à lire et (au moins pour moi) vous permet de déboguer visuellement le script :

mkdir build
cd build
touch blank.txt

Y a-t-il des avantages techniques à tout mettre sur une seule ligne ?

5voto

rackandboneman Points 331

Une autre raison pourrait être la façon dont le script a été créé : Il n'est pas rare que des utilisateurs techniques construisent de très longues lignes de commande interactives, les étendent et les testent à plusieurs reprises jusqu'à ce qu'elles fonctionnent comme souhaité, puis collent le résultat dans un fichier texte et insèrent un fichier #!/bin/bash sur l'en-tête. Parfois, plusieurs segments d'un script sont développés par cette méthode.

Constructions longues d'une ligne commençant par for i in , grep | cut | sed | xargs les chaînes, l'utilisation intensive de && et || , $(cat something) sont souvent révélateurs de ces origines.

3voto

allo Points 571

Y a-t-il des avantages techniques à tout mettre sur une seule ligne ?

Ce n'est qu'une question de style. Il n'y a pas d'avantages techniques.

Je pense que d'autres ont très bien expliqué les différences entre les trois lignes, mais notez que cela ne signifie pas qu'il faille les placer sur une seule ligne.

foo &&
bar

fait la même chose que foo && bar . Il faut toutefois être prudent, car

foo
&& bar

ne fait pas la même chose, mais exécute foo et produit ensuite une erreur de syntaxe. La règle générale s'applique dans la plupart des cas : Lorsque le Shell sait, d'après la syntaxe, que votre ligne n'est pas complète, il vous permet de passer à la ligne suivante.
Lorsque la première ligne peut être exécutée telle quelle, elle est exécutée (et la ligne suivante peut être ou non une erreur de syntaxe, parce que la première est manquante).

Si vous souhaitez que votre script soit plus lisible, vous pouvez échapper au caractère de retour à la ligne comme suit

foo \
&& bar

Veillez à ce qu'il n'y ait pas d'espace blanc après le champ \ car il doit précéder directement le caractère de la nouvelle ligne.

2voto

mrks Points 121

De nombreuses réponses parlent de sécurité, par exemple "Que se passe-t-il si ". cd échoue" ?

Tout en combinant des commandes telles que cd foo && rm * résout ce problème, mais il existe une bien meilleure façon de le faire :

Prenez cette structure de dossier :

.
./foo
./foo/bar
./foo2
./foo2/bar2
./test.sh
./do_not_delete_me

et le script suivant :

find .
cd notexisting
rm *
cd ../foo2
rm *
cd ..
find .

En tant que notexisting n'existe pas, rm * se déroulera en . et supprimer do_not_delete_me .

Cependant, si vous démarrez le script avec set -e il s'interrompra à la première commande qui échouera :

./test.sh: line 4: cd: notexisting: No such file or directory

Comme mentionné dans les commentaires, il est logique de l'inclure dans le shebang : #!/bin/bash -e .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X