Ich habe in bash (:) nach noop gesucht, konnte aber keine guten Informationen finden. Was ist der genaue Zweck oder Anwendungsfall dieses Operators?
Ich habe versucht zu folgen und es funktioniert so für mich:
[mandy@root]$ a=11
[mandy@root]$ b=20
[mandy@root]$ c=30
[mandy@root]$ echo $a; : echo $b ; echo $c
10
30
Bitte lassen Sie mich wissen, jeden Anwendungsfall dieses Betreibers in Echtzeit oder an jedem Ort, an dem die Verwendung obligatorisch ist.
:
integrierte System in Bourne Shell und Ksh sowie in Bash vorhanden ist.:
in tldp.org/LDP/abs/html/special-chars.htmlAntworten:
Es ist mehr aus historischen Gründen da. Der eingebaute Doppelpunkt entspricht
:
genautrue
. Es ist traditionell zu verwenden,true
wenn der Rückgabewert wichtig ist, beispielsweise in einer Endlosschleife:Es ist traditionell zu verwenden,
:
wenn die Shell-Syntax einen Befehl erfordert, Sie aber nichts zu tun haben.Die
:
builtin Termine den ganzen Weg zurück in die Thompson Schale , war es vorhanden in Unix v6 .:
war ein Label-Indikator für diegoto
Aussage der Thompson-Shell . Die Beschriftung kann ein beliebiger Text sein, der:
gleichzeitig als Kommentarindikator fungiert (wenn dies nicht der Fall istgoto comment
,: comment
handelt es sich tatsächlich um einen Kommentar). Die Bourne-Muschel hatte siegoto
nur behalten:
.Eine gebräuchliche Redewendung, die verwendet
:
wird: ${var=VALUE}
, ist , die festgelegt wirdvar
,VALUE
wenn sie nicht festgelegt wurde, und nichts tut, wenn sievar
bereits festgelegt wurde. Dieses Konstrukt existiert nur in Form einer Variablensubstitution, und diese Variablensubstitution muss irgendwie Teil eines Befehls sein: Ein No-Op-Befehl ist gut geeignet.Siehe auch Welchen Zweck erfüllt der eingebaute Doppelpunkt? .
quelle
#
für Kommentare (oder#!/bin/sh
Shebangs) verwendet. Der:
Befehl führte Kommentare ein und wehe dem naiven Programmierer, der in seinen Kommentaren eine schöne Schachtel mit Sternen gemacht hat:: ****
(oder schlimmer noch: * * *
).: * * *
?:
es sich um einen Befehl handelt, muss die Shell ihre Argumente noch verarbeiten, bevor sie feststellen kann, dass sie:
ignoriert werden. Meistens lässt Sie die Shell nur zusätzliche Arbeit leisten, um sie*
auf eine Liste von Dateien im aktuellen Verzeichnis zu erweitern. Es hat keinen Einfluss darauf, wie das Skript funktioniert.set -e
. Wie auch immer, hoffentlich können wir uns alle darauf einigen#
:)while : ; do ... ; done
wenn ich eine schnelle und schmutzige Endlosschleife will. (Normalerweise gibt es einesleep
in der Schleife, und ich tippe Strg-C, um sie zu töten.)Ich benutze es für if-Anweisungen, wenn ich den gesamten Code auskommentiere. Zum Beispiel haben Sie einen Test:
Sie möchten jedoch vorübergehend alles auskommentieren, was darin enthalten ist:
Was dazu führt, dass bash einen Syntaxfehler ausgibt:
Bash kann keine leeren Blöcke (WTF) haben. Sie fügen also ein No-Op hinzu:
oder Sie können das No-Op verwenden, um die Zeilen zu kommentieren:
quelle
Wenn Sie
set- e
dann|| :
eine gute Möglichkeit ist , um nicht das Skript zu beenden , wenn ein Fehler passiert (es macht explizit übergeben).quelle
|| :
dann später Umgang mit dem Fehler , sich mit einemexit 0
finden Sie alle stdout und stderr in der App - Fenster lassen Anzeige während des Debuggens. Überlegen Sie,{ foo ... 2>&1; } || :
was viel einfacher ist als das Einrichten komplexerer Fallen und Wenn-Dann.Sie würden verwenden
:
, um einen Befehl anzugeben, der erfolgreich ist, aber nichts tut. In diesem Beispiel ist der Befehl "Ausführlichkeit" standardmäßig deaktiviert, indem er auf gesetzt wird:
. Die Option 'v' aktiviert es.quelle
$(verbosity $i)
spätere (und bedingte) nichts tut.alias
Argumente ignorierenManchmal möchten Sie einen Alias haben, der keine Argumente enthält. Sie können es tun mit
:
:quelle
:
leider nicht, wie es funktioniert. Das von Ihnen angegebene Beispiel erscheint überflüssig.#
#
alles, was syntaktisch in derselben Zeile steht, ignoriert. Dies ist wirklich anders (überlegen Siemy_alias arg ; other_command
oder umgekehrtmy_alias arg1 {BACKSLASH}{NEWLINE} arg2
) und wahrscheinlich nicht das, was Sie wollen, da es zu Syntaxfehlern führen kann (raten Sie, waswhile my_alias ; do true ; done
oder was Siewhile true ; do my_alias ; done
tun werden).Eine Verwendung sind mehrzeilige Kommentare oder das Auskommentieren eines Teils Ihres Codes zu Testzwecken, indem Sie ihn in Verbindung mit einer Here-Datei verwenden.
Vergessen Sie nicht, Anführungszeichen zu verwenden,
EOF
damit der darin enthaltene Code nicht ausgewertet wird$(foo)
. Es könnte sich auch lohnen, ein intuitives Terminator Namen wieNOTES
,SCRATCHPAD
oderTODO
.quelle
Zwei von mir.
POD-Kommentare einbetten
Eine ziemlich funky Anwendung von
:
ist das Einbetten von POD-Kommentaren in Bash-Skripten , so dass Manpages schnell generiert werden können. Natürlich würde man irgendwann das ganze Skript in Perl umschreiben ;-)Laufzeitfunktionsbindung
Dies ist eine Art Codemuster für Bindungsfunktionen zur Laufzeit. Fi, haben eine Debugging-Funktion, um etwas nur zu tun, wenn ein bestimmtes Flag gesetzt ist:
Du erhältst:
quelle
Manchmal können No-Op-Klauseln Ihren Code lesbarer machen.
Das kann Ansichtssache sein, aber hier ist ein Beispiel. Angenommen, Sie haben eine Funktion erstellt, die zwei Unix-Pfade verwendet. Es berechnet den 'Änderungspfad', der benötigt wird, um von einem Pfad zum anderen zu wechseln. Sie schränken Ihre Funktion ein, dass die Pfade beide mit einem '/' beginnen müssen ODER beide nicht.
Einige Entwickler werden das No-Op entfernen wollen, aber das würde bedeuten, die Bedingung zu negieren:
Nun - meiner Meinung nach - ist aus der if-Klausel nicht so klar, unter welchen Bedingungen Sie die Ausführung der Funktion überspringen möchten. Um das No-Op zu eliminieren und es klar zu machen, möchten Sie die if-Klausel aus der Funktion entfernen:
Das sieht besser aus, aber oft können wir das nicht tun. Wir möchten, dass die Prüfung innerhalb der Funktion erfolgt.
Wie oft passiert das? Nicht sehr häufig. Vielleicht ein- oder zweimal im Jahr. Es kommt oft genug vor, dass Sie sich dessen bewusst sein sollten. Ich scheue mich nicht, es zu verwenden, wenn ich denke, dass es die Lesbarkeit meines Codes verbessert (unabhängig von der Sprache).
quelle
:
, sollten Sie verwenden:
, nichttrue
in der Antwort. Der einfachste Weg, die Bedingung hier zu negieren, besteht darin, einen[[ ... ]]
Befehl zu verwenden und ihm Folgendes voranzustellen!
:if ! [[ ( ... && ... ) || ( ... && ... ) ]]; then
.: ${...=...}
es wohl weniger umständlich aussieht alstrue ${...=...}
. Einige bevorzugenwhile :; do
es vielleicht auchwhile true; do
wegen der Knappheit.Etwas im Zusammenhang mit dieser Antwort finde ich dieses No-Op ziemlich praktisch, um polyglotte Skripte zu hacken . Hier ist zum Beispiel ein gültiger Kommentar sowohl für Bash als auch für Vimscript:
Sicher, wir haben es vielleicht
true
genauso gut verwendet, aber:
ein Interpunktionszeichen und kein irrelevantes englisches Wort zu sein, macht deutlich, dass es sich um ein Syntax-Token handelt.Was , warum sollte jemand tun , eine solche heikle Sache wie eine polyglotte Skript zu schreiben (außer es ist cool): beweist es hilfreich in Situationen , in denen wir normalerweise mehrere Skriptdateien in verschiedenen Sprachen schreiben würde, mit Datei
X
zu Datei beziehenY
.In einer solchen Situation vermeidet das Kombinieren beider Skripte in einer einzigen polyglotten Datei jegliche Arbeit bei der
X
Bestimmung des Pfades zuY
(es ist einfach"$0"
). Noch wichtiger ist, dass es bequemer ist, sich im Programm zu bewegen oder es zu verteilen.Ein häufiges Beispiel. Es gibt ein bekanntes, seit langem bestehendes Problem mit Shebangs: Bei den meisten Systemen (einschließlich Linux und Cygwin) kann nur ein Argument an den Interpreter übergeben werden. Der folgende Schebang:
wird den folgenden Befehl auslösen:
und nicht die beabsichtigte:
Sie würden also am Ende ein Wrapper-Skript schreiben, wie zum Beispiel:
Hier kommt die Polyglossie ins Spiel.
Ein genaueres Beispiel. Ich habe einmal ein Bash-Skript geschrieben, das unter anderem Vim aufrief. Ich musste Vim zusätzliches Setup geben, was mit der Option möglich war
--cmd "arbitrary vimscript command here"
. Dieses Setup war jedoch umfangreich, so dass es schrecklich gewesen wäre, es in eine Zeichenfolge einzufügen (wenn es jemals möglich gewesen wäre). Daher war es eine bessere Lösung, es in einer Konfigurationsdatei in extenso zu schreiben und dann Vim diese Datei mit lesen zu lassen-S "/path/to/file"
. Daher habe ich eine polyglotte Bash / Vimscript-Datei erhalten.quelle
Ich habe auch darin Skripte verwendet, um Standardvariablen zu definieren.
quelle
Angenommen, Sie haben einen Befehl, den Sie zum Erfolg eines anderen verketten möchten:
Jetzt möchten Sie die Befehle jedoch bedingt ausführen und die Befehle anzeigen, die ausgeführt werden sollen (Trockenlauf):
Wenn Sie also DEBUG und NOEXEC festlegen, wird der zweite Befehl nie angezeigt. Dies liegt daran, dass der erste Befehl niemals ausgeführt wird (weil NOEXEC nicht leer ist), aber die Auswertung dieser Tatsache führt zu einer Rückgabe von 1, was bedeutet, dass der untergeordnete Befehl niemals ausgeführt wird (aber Sie möchten, dass es sich um einen Trockenlauf handelt). Um dies zu beheben, können Sie den auf dem Stapel verbleibenden Exit-Wert mit einem Noop zurücksetzen:
quelle