9
votes

C Fonction pour échapper à la chaîne pour l'argument de la commande shell?

Quelle fonction dois-je utiliser pour échapper à des chaînes pour l'argument de commande shell en C?

  1. J'ai une chaîne:

    ceci est une chaîne avec () caractères

  2. Ce sera une erreur:

    echo ceci est une chaîne avec () caractères

  3. Ce sont ok:

    écho "Il s'agit d'une chaîne avec () caractères"

    echo Ceci est une chaîne avec \ (\) caractères

    Y a-t-il une fonction prédéfinie convertie # 2 en 3 en C?


0 commentaires

5 Réponses :


1
votes

rien prédéfini et quels caractères ont besoin d'échappement dépend de votre coquille. Regardez les documents pour votre coquille et remplacez chaque x avec \ x. Utiliser des guillemets doubles "nécessitera le même traitement si la chaîne que vous entourez contient un".

Notez également que cela sera plus compliqué si vous avez l'intention d'encapsuler des expressions plus compliquées (tout ce qui est aggravé avec un ';', par exemple)


0 commentaires

2
votes

Il n'y a pas de fonction prédéfinie.

Cependant, je pense qu'il suffit de joindre n'importe quel argument de coque dans des guillemets simples et de veiller à ce que les guillemets simples soient échappées.

C'est la logique du Fonction ESCAPESHellarg en PHP et je le crois fonctionne raisonnablement bien.


2 commentaires

Dans le contexte des coquilles, notez qu'il existe une différence entre QOUTER avec des guillemets simples ou doubles. Avec des citations doubles Vous devez échapper $ et ` aussi bien .


Notez plus loin que les coquilles n'autorisent pas les citations simples en cordes cotées.



8
votes

Remplacement de toutes les instances de ' avec ' \ '' '' enfermant la chaîne complète en guillemets simples ( ') est un moyen sûr. Cela fonctionne même avec des nouvelles lignes intégrées. Une autre méthode serait d'insérer \ avant chaque caractère, sauf que vous devez alors faire un traitement spécial pour les nouvelles lignes car \ suivi d'une nouvelle ligne est ignoré par la coque, non traité comme une nouvelle ligne littérale. Vous devez entourer de nouvelles lignes avec ' (guillemets simples).


4 commentaires

Essayez ceci avec String: A'b. Pour moi, echo 'A \' B '... ne fonctionne pas dans Bash, mais echo' A '"" "" B' fait ....


@Erikaronesty: J'ai dit de remplacer ' avec ' \ '' ', pas avec \' .


Notez que citer ' donne des résultats ' '' '' '' '' , qui est en fait une séquence de trois chaînes qui sont ajoutées en évaluation. Par conséquent, ce n'est pas une citation réelle.


@ Manuelschneid3R: citation nécessaire. Votre commentaire ne correspond pas à la scission de champ de coquillage et de citer les travaux d'élimination même conceptuellement. Voir pubs.opengroup.org/onlinePubs/9699919799/uties/...



1
votes



XXX

donné Escape'this ', il produira 'ESCAPE' \ '' '' '' "\ '' '<' '' , qui peut ensuite être transmis à echo . xxx < / pré>


1 commentaires

La réaffectation n'est-elle pas une opération escompte? Je me souviens qu'il est possible que toute la chaîne soit copiée dans un nouvel endroit. Il serait préférable d'allouer 2 * str_size au début. Vous n'utilisez pas souvent des arguments avec beaucoup de ' mais toujours ...



1
votes

Remplacez chaque citation ' avec ' \ '' ' enfermine la chaîne résultante entre les guillemets simples ' : xxx


0 commentaires