Befehl "quote" in der Shell

15

Was ist die Verwendung des Befehls quote? Ich habe keine Informationen darüber gefunden, es ist nicht unter den ausführbaren Dateien in /binOrdnern und es kann nicht unter den integrierten Bash- Dateien gefunden werden. Es scheint, dass es nur seinen ersten Parameter ausgibt, wie ein echoBefehl und nichts weiter.

whtyger
quelle
es werden nur die Anführungszeichen
hinzugefügt
1
Ich habe mich nur umgesehen und ein Hilfsprogramm namens shell-quote gefunden, das Zitat ähnelt, aber einige Anwendungen mit Dingen wie ssh und zum Debuggen von Bash-Skripten hat. Ich dachte, ich würde es hier als Fußnote einfügen. ' linux.die.net/man/1/shell-quote '
Joe
Es fühlt sich an, als hätte eine WTF ein so gemeinsames Wort, quotedas für einen so obskuren Zweck verwendet wird ... Kein Präfix, um es als "intern" zu kennzeichnen, keine Dokumentation, nichts, es sei denn, Sie gehen in die Implementierungsdetails der fortschrittlichen Vervollständigungsmechanik der Distribution ein. Ich finde das etwas störend.
Hyde
Es wird noch dunkler für die Person, deren Muttersprache nicht Englisch ist. Wie ich zum Beispiel. :)
whtyger

Antworten:

10

Was ist es?

Ich habe festgestellt, dass dieser Befehl in meiner Shell nicht funktioniert ( fish, friendly interactive shell ). Es scheint, als würde es nur in bash funktionieren (Ubuntus Standardeinstellung).

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"
}

Was tut es? Wofür kann es verwendet werden?

Es werden die Anführungszeichen hinzugefügt, aber keine Zeilenumbrüche. Es entgeht auch einfachen Anführungszeichen in einer Weise, die für die Bash geeignet ist. In Skripten kann es nützlich sein, eine Variable oder eine andere Art von Zeichenfolge in Anführungszeichen zu setzen. Sie benötigen dies beispielsweise für Pfade / Parameter mit Leerzeichen. Es gibt jedoch auch andere Möglichkeiten, dies zu tun.

Es ist wirklich seltsam, dass ich keine Dokumentation (im Web) darüber finden konnte. Aber es ist leicht zu sehen, was es tut.

verpfeilt
quelle
2
whichist nutzlos, sowohl in interaktiven Shells als auch in Skripten. Verwenden Sie typestattdessen. type quoteZeigt an, dass es sich um eine Funktion handelt, und zeigt sogar die Funktionsdefinition an. Laufen Sie help typefür mehr auf dem typeeingebauten.
Geirha
Du hast recht, danke. Ich habe die Antwort oben gesehen, bei der auch der Typ verwendet wurde, um herauszufinden, was er ist. Nun, dank 'dem' wusste ich, dass es sich nicht um eine ausführbare Datei in / bin / handelt, da es keinen Pfad zurückgab. Ich denke, es war immer noch nützlich. Aber du hast recht, ich werde Typ hinzufügen.
7.
2
In meinem Ubuntu 12.04 ist diese Funktion wirklich in beschrieben /etc/bash_completion, die ~/.bashrcstandardmäßig bezogen wird, nicht von der Stelle, /etc/bash.bashrcan der der betreffende Abschnitt auskommentiert /etc/bash_completionist. Auch /usr/share/bash-completion/Ordner fehlt in Ubuntu 12.04.
Whtyger
8

quoteist eine Funktion, die in der Datei definiert ist (hier auf meinem Debian-System, aber ich denke, es ist dasselbe auf Ubuntu) /usr/share/bash-completion/bash_completion, die selbst /etc/bash.bashrcbeim Start von Bash bezogen wird .

Ich würde diese Funktion niemals nutzen! Wenn Sie etwas zitieren müssen, damit es von einer Shell sicher verwendet werden kann, verwenden Sie printfden %qModifikator wie folgt:

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

Selbst wenn dies sehr selten verwendet wird, gibt es immer bessere Strategien für High-Level-Inhalte als wir, die Benutzer, normalerweise. Dieses quoteDing wird intern von etwas Obskurem benutzt, von dem wir nicht einmal wissen wollen. Diese quoteFunktion ist wahrscheinlich herstellerspezifisch / vertriebsspezifisch (lesen Sie Debian-spezifisch) und ist wahrscheinlich überhaupt nicht portierbar und kann sich in zukünftigen Versionen sogar ändern.

Bearbeiten. Ich habe gerade ein Ubuntu 12.04-System überprüft, und die quoteFunktion ist definiert in /etc/bash_completion, bezogen von /etc/bash.bashrc, selbst bezogen von /etc/profile.

Wie habe ich das festgestellt? mit etwas heuristik:

  • Überprüfen Sie, ob quoteangezeigt wird in /etc/profile:

    grep '\bquote\b' /etc/profile

    Weiter mit dem nächsten Schritt.

  • Wovon werden die Dateien bezogen /etc/profile?

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

    Ich habe $i(Notwendigkeit , in die Quelle zu suchen , was diese Quellen, aber in diesem Fall ist es die Dateien /etc/profile.d/*.shfalls vorhanden (und wenn lesbar) und /etc/bash.bashrc. Auf der Suche in /etc/bash.bashrc.

  • Ist quotein /etc/bash.bashrc? ja / nein, etc ...
gniourf_gniourf
quelle
quoteEntgeht eigentlich einfachen Anführungszeichen, so dass es von der Shell verwendet werden kann. Es funktioniert genauso gut wie printf %qfür diesen Anwendungsfall.
Flimm
@Flimm auf eigene Gefahr benutzen!
gniourf_gniourf
@gniourf_gniourf Ich denke printf% q behandelt Tilde ( ~ ) nicht richtig . Versuchen Sie folgendes: my_str='~/.bashrc'; echo ' Expected:' "$my_str"; bash -c "echo ' quote:' $(quote "$my_str")"; bash -c "echo 'printf %q:' $(printf '%q\n' "$my_str")". Sie würden sehen , so etwas wie Expected: ~/.bashrc, quote: ~/.bashrcund printf %q: /home/your_username/.bashrc.
Rockallite
1
@ Rockallite: Ich habe es gerade ausprobiert und es funktioniert erwartungsgemäß ...
gniourf_gniourf
Wenn Sie direkt zur Quelle (shopt -s extdebug; declare -F quote)
springen
3

quote ist eine Funktion:

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

Diese Funktion wird irgendwo in einer Bash-Initialisierungsdatei definiert. Genauer gesagt, wenn Sie Ubuntu 13.04 verwenden, finden Sie es in /usr/share/bash-completion/bash_completionder Zeile 142.

Verwenden Sie den folgenden Befehl, um dies zu überprüfen:

type quote

Sein Zweck ist offensichtlich klar.

Radu Rădeanu
quelle
Was es tut, ist klar - aber warum Sie es tun möchten, kann es nicht sein. Um Zweifel zu vermeiden: Es wird verwendet, um eine Variable zu verwenden $INPUT, die Leerzeichen, Anführungszeichen oder andere Zeichen enthalten kann, und um eine Zeichenfolge zurückzugeben, die definitiv nur von bash als einzelnes Argument behandelt wird.
Ben XO