En relation: Quel interpréteur de shell exécute un script sans shebang?
Le script n'a pas de ligne shebang / hashbang / #!
, simplement parce qu'un double tiret ne l'est pas #!
.
Cependant, le script sera exécuté par un shell (voir les questions et réponses liées ci-dessus), et dans ce shell, si -
est un caractère valide dans un nom de fonction, la ligne déclare une fonction shell appelée --
qui ne fait rien (enfin, elle s'exécute :
, qui ne fait rien ) et qui n'est jamais appelé.
La fonction, dans la notation multi-lignes la plus courante (juste pour rendre plus évidente à quoi elle ressemble, car son nom étrange masque un peu le fait qu'il s'agit en fait d'une fonction):
-- () {
:
}
Le seul but de la définition de fonction est d'avoir une ligne valide dans un script shell et en même temps une commande SQL valide (un commentaire). Ce type de code est appelé polyglotte .
Après avoir déclaré la fausse fonction de shell, le script, lorsqu'il est exécuté par un interpréteur de script de shell, utilise exec
pour remplacer le shell actuel par le processus résultant de l'exécution db2 -txf "$0"
, ce qui reviendrait à utiliser db2 -txf
le nom de chemin du script à partir de la ligne de commande.
Cette astuce ne fonctionnerait probablement pas de manière fiable sur des systèmes où dash
ou d'autres ash
shell basés sur yash
, le shell Bourne, ksh88
ou ksh93
est utilisé comme /bin/sh
, car ces shell n'acceptent pas les fonctions dont le nom contient des tirets.
Également lié:
Je suppose que ce qui suit fonctionnerait également (pas vraiment testé):
--() { exec db2 -txf "$0"; }; --