Comando "quote" nella shell


15

Qual è l'uso del comando quote? Non ho trovato alcuna informazione a riguardo, non è tra i file eseguibili nelle /bincartelle e non può essere trovato tra i built-in di Bash. Sembra che stampa solo il suo primo parametro, come un echocomando e niente di più.


aggiunge solo le citazioni
Hakeem Wahab

1
Frugando, ho trovato un'utilità chiamata shell-quote che è simile alla citazione, ma ha alcuni usi con cose come ssh e per il debug degli script bash. Ho pensato di includerlo qui come nota a piè di pagina. ' linux.die.net/man/1/shell-quote '
Joe

Sembra che un WTF abbia una parola così comune quote, usata per uno scopo così oscuro ... Nessun prefisso per contrassegnarlo come "interno", nessuna documentazione, niente, a meno che non si approfondisca i dettagli dell'implementazione della meccanica di completamento avanzata della distribuzione. Lo trovo un po 'inquietante.
hyde,

Diventa ancora più oscuro per la persona, la cui lingua madre non è l'inglese. Come me, per esempio. :)
Whtyger il

Risposte:


10

Che cos'è?

Ho notato che questo comando non funziona nella mia shell ( pesce, amichevole shell interattiva ). Sembra che funzioni solo in bash (impostazione predefinita di 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"
}

Che cosa fa? Per cosa può essere usato?

Aggiunge le virgolette ma nessuna nuova riga. Sfugge anche alle virgolette singole in un modo adatto per bash. Può essere utile negli script per citare una variabile o qualche altro tipo di stringa. È necessario, ad esempio, per percorsi / parametri con spazi. Sebbene ci siano altri modi per farlo.

È davvero strano che non sia stato possibile trovare alcuna documentazione (sul web) al riguardo. Ma bene, è facile vedere cosa fa.


2
whichè inutile, sia nelle shell interattive che negli script. Usa typeinvece. type quoteti dirà che è una funzione e mostra anche la definizione della funzione. Corri help typeper più sull'integrato type.
geirha,

Hai ragione, grazie. Ho visto la risposta sopra che ha anche usato il tipo per scoprire di cosa si tratta. Bene, grazie a "quale" sapevo che non era un eseguibile in / bin / o giù di lì, perché non restituiva alcun percorso. Penso che sia stato comunque utile. Ma hai ragione, aggiungerò il tipo.
verpfeilt,

2
Nel mio Ubuntu 12.04 questa funzione è veramente descritta in /etc/bash_completion, che proviene ~/.bashrcper impostazione predefinita, non da /etc/bash.bashrcdove /etc/bash_completionviene commentata la sezione relativa . Anche la /usr/share/bash-completion/cartella è assente in Ubuntu 12.04.
Whtyger

8

quoteè una funzione definita (qui sul mio sistema Debian, ma immagino sia la stessa su Ubuntu) nel file /usr/share/bash-completion/bash_completion, che a sua volta proviene /etc/bash.bashrcall'avvio di Bash.

Non userei mai questa funzione! Se hai bisogno di citare roba in modo da essere tranquillamente utilizzabile da una shell, usa printfil %qmodificatore, come:

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

In effetti, anche se questo è usato molto raramente, ci sono sempre strategie migliori per cose di alto livello come noi, gli utenti, di solito facciamo. Questa quotecosa viene utilizzata internamente da alcune cose oscure che non vogliamo nemmeno conoscere. Questa quotefunzione è probabilmente specifica di un fornitore / distribuzione (leggi specifiche di Debian) e probabilmente non è portatile e potrebbe anche cambiare nelle versioni future.

Modificare. Ho appena controllato su un sistema Ubuntu 12.04 e la quotefunzione è definita da /etc/bash_completion, originata da /etc/bash.bashrcessa stessa /etc/profile.

Come l'ho determinato? usando un po 'di euristico:

  • Controlla se quoteappare in /etc/profile:

    grep '\bquote\b' /etc/profile

    No. Vai al passaggio successivo.

  • Da cosa provengono i file /etc/profile?

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

    Ho $i(necessità di esaminare la fonte per ciò che questo le fonti, ma in questo caso è il file di /etc/profile.d/*.sheventuali (e se leggibile) e /etc/bash.bashrc. Guardando a /etc/bash.bashrc.

  • È quotedentro /etc/bash.bashrc? sì / no, ecc ...

quotein realtà sfugge alle virgolette singole, quindi è utilizzabile dalla shell. Funziona altrettanto bene printf %qper questo caso d'uso.
Flimm,

@Flimm utilizzare a proprio rischio e pericolo!
gniourf_gniourf

@gniourf_gniourf Penso che printf% q non gestisca correttamente tilde ( ~ ). Prova questo: my_str='~/.bashrc'; echo ' Expected:' "$my_str"; bash -c "echo ' quote:' $(quote "$my_str")"; bash -c "echo 'printf %q:' $(printf '%q\n' "$my_str")". Si potrebbe vedere qualcosa di simile Expected: ~/.bashrc, quote: ~/.bashrce printf %q: /home/your_username/.bashrc.
Rockallite,

1
@Rockallite: l'ho appena provato e funziona come previsto ...
gniourf_gniourf

Se vuoi saltare direttamente alla fonte, puoi usare (shopt -s extdebug; declare -F quote), che ti dice il nome della funzione, il numero di riga in cui è definito e il nome del file in cui è definito.
wjandrea

3

quote è una funzione:

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

Questa funzione è definita da qualche parte in un file di inizializzazione bash. Più precisamente, se si utilizza Ubuntu 13.04, è possibile trovarlo nella /usr/share/bash-completion/bash_completionriga 142.

Utilizzare il comando seguente per controllarlo:

type quote

Il suo scopo è evidentemente chiaro.


Ciò che fa è chiaro, ma il motivo per cui vorresti farlo potrebbe non esserlo. A scanso di equivoci: sarebbe usato per prendere una variabile come $INPUT, che può contenere spazi, virgolette o altri caratteri, e restituire una stringa che viene sicuramente trattata come un singolo argomento da bash.
Ben XO,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.