Qu'est-ce qui se passe réellement avec les backticks de bash?


1

J'ai toujours pensé que les backticks de bash étaient "exécuter la sortie de 'some_command'". Que se passe-t-il dans la suite ... considérons un script myscript.plqui imprime le texte suivant:

   export PS1 = "[STRING] $ PS1"

Si je copie la sortie de cat file.txtsur la ligne de commande et que je l' exécute, "[STRING]" est ajouté au début de mon invite.

Par contre, le backtick-ing 'myscript.pl'me rend rapide "[STRING]. Qu'est-ce qui se passe?


Désolé pour le formatage - je ne pouvais pas obtenir de backticks dans un bloc de code.
Andrew Wood

Réponses:


4

bashne pas exécuter la sortie d'une commande backtick, ne la remplace. (La fonctionnalité s'appelle après tout substitution de commande .)

Si la substitution n'est pas entre guillemets doubles, le fractionnement des mots est effectué dans la sortie de la commande, mais les guillemets et autres caractères spéciaux sont ignorés. export PS1="[STRING] $PS1"est simplement divisé en $IFS:

  • export
  • PS1="[STRING
  • $PS1"

Si vous voulez exécuter le contenu d'un fichier, sourcez-le:

. ./file.txt

ou non-POSIX:

source ./file.txt

Si vous souhaitez que toutes les analyses standard soient appliquées à une substitution - par exemple une variable - vous pouvez utiliser eval "$commands"ou eval "$(foo)"oueval "`foo`" . Mais soyez très prudent avec cela.


Permettez-moi de clarifier ma question. Je ne stocke pas les commandes dans un fichier texte, mais je pense que ce serait un bon moyen de connaître mon problème. J'ai un script Perl configuré pour configurer des variables d'environnement. Pour éviter de perdre l’environnement actuel (pas vraiment le bon mot - alias, fonction, variables de shell, etc.), le script crée des modifications dans l’environnement, que l’utilisateur pourra éventuellement appliquer en utilisant des pseudonymes pour invoquer le scénario.
Andrew Wood

Cependant, je vois que mettre eval devant mon expression en retrait fonctionne comme je le voudrais
Andrew Wood

@ajwood: Permettez-moi de souligner le dernier paragraphe de ma réponse. ( N'oubliez pas les citations. Sinon, ça casse.)
grawity le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.