Commande «quote» dans le shell

15

À quoi sert la commande quote? Je n'ai trouvé aucune information à ce sujet, elle ne figure pas parmi les fichiers exécutables dans les /bindossiers et elle ne peut pas être trouvée parmi les intégrés Bash. Il semble qu'il n'imprime que son premier paramètre, comme une echocommande et rien de plus.

whtyger
la source
il ajoute juste les citations
Hakeem Wahab
1
Juste en fouillant, j'ai trouvé un utilitaire appelé shell-quote qui est similaire à quote, mais a certaines utilisations avec des choses comme ssh et pour le débogage des scripts bash. Je pensais l'inclure ici comme note de bas de page. ' linux.die.net/man/1/shell-quote '
Joe
Se sent comme un WTF pour avoir un mot aussi commun quote, utilisé à des fins si obscures ... Pas de préfixe pour le marquer "interne", pas de documentation, rien, sauf si vous allez fouiller dans les détails d'implémentation de la mécanique de complétion avancée de la distribution. Je trouve cela un peu dérangeant.
hyde
Cela devient encore plus obscur pour la personne, dont la langue maternelle n'est pas l'anglais. Comme moi, par exemple. :)
whtyger

Réponses:

10

Qu'Est-ce que c'est?

J'ai remarqué que cette commande ne fonctionne pas dans mon shell ( poisson, shell interactif convivial ). Il semble que cela ne fonctionne que dans bash (par défaut d'Ubuntu).

chocobai@pc ~> /bin/bash 
chocobai@pc:~$ quote asdf
'asdf'chocobai@pc:~$ 

chocobai@pc:~$ type quote
quote is a function.
quote ()
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

Qu'est ce que ça fait? À quoi peut-il servir?

Il ajoute les guillemets mais pas de nouvelle ligne. Il échappe également aux guillemets simples d'une manière adaptée à bash. Il peut être utile dans les scripts de citer une variable ou un autre type de chaîne. Vous en avez besoin par exemple pour les chemins / paramètres avec des espaces. Bien qu'il existe d'autres façons de procéder.

C'est vraiment étrange, je n'ai pu trouver aucune documentation (sur le Web) à ce sujet. Mais bon, c'est facile de voir ce que ça fait.

verpfeilt
la source
2
whichest inutile, à la fois dans les shells interactifs et dans les scripts. Utilisez typeplutôt. type quotevous dira que c'est une fonction et affiche même la définition de la fonction. Courez help typepour en savoir plus sur la fonction typeintégrée.
geirha
Tu as raison, merci. J'ai vu la réponse ci-dessus qui a également utilisé le type pour savoir ce que c'est. Eh bien, grâce à «qui», je savais que ce n'était pas un exécutable dans / bin / ou ainsi, car il ne renvoyait aucun chemin. Je pense que c'était encore assez utile. Mais vous avez raison, je vais ajouter du type.
verpfeilt
2
Dans mon Ubuntu 12.04, cette fonction est vraiment décrite dans /etc/bash_completion, qui provient ~/.bashrcpar défaut, pas de l' /etc/bash.bashrcendroit où la section concernant /etc/bash_completionest commentée. Le /usr/share/bash-completion/dossier est également absent dans Ubuntu 12.04.
whtyger
8

quoteest une fonction qui est définie (ici sur mon système Debian, mais je suppose que c'est la même chose sur Ubuntu) dans le fichier /usr/share/bash-completion/bash_completion, qui lui-même provient /etc/bash.bashrcdu démarrage de Bash.

Je n'utiliserais jamais cette fonction! Si vous avez besoin de citer des trucs pour être utilisables en toute sécurité par un shell, veuillez utiliser printfavec le %qmodificateur, comme

printf '%q\n' "Hello my friend I like 'single quotes' as well as \"double quotes\""

En fait, même si cela est très rarement utilisé, il existe toujours de meilleures stratégies pour les choses de haut niveau comme nous, les utilisateurs, le faisons habituellement. Cette quotechose est utilisée en interne par des choses obscures que nous ne voulons même pas savoir. Cette quotefonction est probablement spécifique à un fournisseur / distribution (lire spécifique à Debian) et n'est probablement pas portable du tout, et pourrait même changer dans les futures versions.

Éditer. Je viens de vérifier sur un système Ubuntu 12.04, et la quotefonction est définie dans /etc/bash_completion, source par /etc/bash.bashrc, elle-même source par /etc/profile.

Comment ai-je déterminé cela? en utilisant un peu d'heuristique:

  • Vérifiez si quoteapparaît dans /etc/profile:

    grep '\bquote\b' /etc/profile

    Passez à l'étape suivante.

  • Par quels fichiers proviennent-ils /etc/profile?

    grep '[[:space:]]\.[[:space:]]' /etc/profile

    J'ai $i(besoin de se pencher sur la source de ce que ces sources, mais dans ce cas ce sont les fichiers le /etc/profile.d/*.shcas échéant (et si facile à lire) et /etc/bash.bashrc. En regardant dans /etc/bash.bashrc.

  • Est -ce quoteen /etc/bash.bashrc? oui / non, etc ...
gniourf_gniourf
la source
quoteéchappe en fait les guillemets simples, il est donc utilisable par le shell. Cela fonctionne aussi bien que printf %qpour ce cas d'utilisation.
Flimm
Utilisation @Flimm à vos risques et périls!
gniourf_gniourf
@gniourf_gniourf Je pense que printf% q ne gère pas correctement le tilde ( ~ ). Essayez ceci: my_str='~/.bashrc'; echo ' Expected:' "$my_str"; bash -c "echo ' quote:' $(quote "$my_str")"; bash -c "echo 'printf %q:' $(printf '%q\n' "$my_str")". Vous verriez quelque chose comme Expected: ~/.bashrc, quote: ~/.bashrcet printf %q: /home/your_username/.bashrc.
Rockallite
1
@Rockallite: Je viens de l'essayer et cela fonctionne comme prévu ...
gniourf_gniourf
Si vous voulez passer directement à la source, vous pouvez utiliser (shopt -s extdebug; declare -F quote), qui vous indique le nom de la fonction, le numéro de ligne auquel elle est définie et le nom de fichier dans
lequel
3

quote est une fonction:

quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

Cette fonction est définie quelque part dans un fichier d'initialisation bash. Plus précisément, si vous utilisez Ubuntu 13.04, vous pouvez le trouver /usr/share/bash-completion/bash_completionsur la ligne 142.

Utilisez la commande suivante pour le vérifier:

type quote

Son objectif est évidemment clair.

Radu Rădeanu
la source
Ce qu'elle fait est clair - mais pourquoi vous ne voulez pas le faire. Pour éviter tout doute: il serait utilisé pour prendre une variable telle que $INPUT, qui peut contenir des espaces, des guillemets ou d'autres caractères, et renvoyer une chaîne qui n'est définitivement traitée que comme un seul argument par bash.
Ben XO du