Bash imbriquée des devis et eval
Je vais avoir de la difficulté citations imbriquées à l'intérieur d'un script bash
argv="su -c '$RVM_PATH wrapper $config_rvm \'$PASSENGER_RVM_BIN $command $options\'' web"
eval $argv
Ci-dessus m'a
eval: line 162: unexpected EOF while looking for matching `''
eval: line 163: syntax error: unexpected end of file
OriginalL'auteur Zeophlite | 2012-03-01
Vous devez vous connecter pour publier un commentaire.
OriginalL'auteur Zeophlite
C'est parce que
\'
n'ont pas de signification particulière au sein d'une seule chaîne de caractères entre guillemets; il signifie simplement "anti-slash, suivi par la fin de la chaîne".Une option est d'utiliser
$'...'
au lieu de'...
'; qui vous permettra d'utiliser la barre oblique inverse échappe. Il devrait ressembler à ceci:L'inconvénient est que si il n'y a aucune chance que
$RVM_PATH
,$config_rvm
, ou l'un des autres variables pourraient inclure une barre oblique inverse, alors il pourrait être interprété comme l'introduction d'une barre oblique inversée échapper.OriginalL'auteur ruakh
Utiliser un tableau à la place.
Ma réponse avait une syntaxe bug.
OriginalL'auteur Ignacio Vazquez-Abrams
Solution générique pour
eval
correctement cité argumentsLa fonction suivante utilise le shell propre citant le mécanisme que je n'ai pas à vous soucier de la façon de nommer correctement les choses:
Exemple d'utilisation:
Remarque ci-dessus, le
single token
'espace s est cité comme\
.Cela montre que les jetons sont en effet séparés.
Donné quelques non approuvé l'entrée d'utilisateur:
Construire une commande eval:
Eval, avec apparemment correct de citer:
Remarque vous avez été piraté.
date
a été exécuté plutôt que d'être imprimé, littéralement.Plutôt avec
token_quote()
:eval
n'est pas mal - c'est juste mal compris 🙂OriginalL'auteur Tom Hale