Est-ce que Bash est compilé ou interprété?

Lorsque Bash exécute votre script, l’parsing-t-il en code ou l’parsing-t-il en tant que commande? Est-ce que Bash comstack réellement et exécute votre script comme le ferait Python, ou est-ce que Bash l’exécute simplement via son parsingur de commandes?

Bash est un interpréteur à une seule passe, ce qui signifie qu’il lit une commande à la fois, l’interprète et l’exécute à tout moment. La même chose est vraie avec d’autres types de shells – sh, ksh, zsh, csh, etc.

Voici un exemple. J’ai un script de 3 lignes appelé test.sh qui ressemble à ceci:

 echo one echo two ' 

Lorsqu’il est exécuté en tant que bash test.sh , il donne cette sortie:

 one two test.sh: line 3: unexpected EOF while looking for matching `'' test.sh: line 4: syntax error: unexpected end of file 

Il exécute les première et seconde commandes avec succès, puis rencontre le guillemet simple et lance l’erreur.

Disons que nous écrivons le même code dans Perl, test.pl :

 print "one\n" print "two\n" ' 

et lancez-le avec perl test.pl On a:

 syntax error at test.pl line 2, near "print" Can't find ssortingng terminator "'" anywhere before EOF at test.pl line 3. 

Donc, il n’a pas du tout exécuté les deux premières lignes, même si elles étaient syntaxiquement correctes. C’est parce que Perl fait deux passes. Dans la première passe, il effectue des vérifications de syntaxe et convertit le script en une forme interne. Au deuxième passage, il l’exécute.

La simplicité de l’exécution en un seul passage du shell est également sa plus grande limitation. En tolérant les erreurs de syntaxe, même en cours d’exécution, il est difficile de créer du code volumineux et robuste avec le langage shell. Cependant, le script shell est un choix idéal pour le code rapide et jetable, en particulier quelque chose qui utilise les utilitaires de ligne de commande.


En relation:

  • Perl est-il un langage de programmation compilé ou interprété?
  • Est-ce que bash est un langage interprété?

Le shell bash , tel qu’il est actuellement (version 4.4), exécute vos scripts de manière purement textuelle. Il ne fait pas de pré-compilation de fichiers dans une forme de code d’octet.

Selon le code source, le shell lui-même utilise simplement reader_loop() pour traiter l’entrée. Cela appelle, dans une boucle, read_command() suivi de execute_command() .

Comme read_command() contient également l’appel à parse_command() qui appelle la fonction d’parsingur yyparse() , cela signifie que l’parsing se produit ligne par ligne et non pas au début dans une phase de compilation importante.

Une autre façon de voir que bash traite son entrée une ligne à la fois consiste à créer un script avec une erreur de syntaxe évidente après une instruction echo valide, puis à exécuter le script. bash produira une sortie avant de générer une erreur de syntaxe:

 echo output () 

produit

 $ bash tmp.sh output tmp.sh: line 2: syntax error near unexpected token ')' tmp.sh: line 2: `()'