“ bash -D ” Befehl ' scheint nichts Nützliches zu tun

Nach all den Jahren bin ich endlich dazu gekommen, mich mit der Shell vertraut zu machen. Ich habe die Manpage nach bash und schauen Sie sich die Option -D an, die laut Handbuch:

  -D A list of all double-quoted strings preceded by $ is printed on the standard output. These are the strings that are sub- ject to language translation when the current locale is not C or POSIX. This implies the -n option; no commands will be executed.  

Auf meinem Mac wird jedoch keine Ausgabe generiert und in eine neue Shell verschoben, die anscheinend weniger Funktionalität als die ursprüngliche Shell aufweist. Die which funktioniert in dieser neuen Shell nicht mehr.

Ich frage mich nur, ob jemand einen Einblick in die Funktionen dieser Option auf dem Mac geben kann. Ich bin mir sicher, dass ich sie wahrscheinlich falsch verwende.

Antwort

Auf meinem Mac bash -D generiert keine Ausgabe

bash -D (und die entsprechende lange Option --dump-strings) liest Befehle aus der Standardeingabe oder einer Datei und extrahiert Zeichenfolgen als übersetzbar markiert , dh Zeichenfolgen in doppelten Anführungszeichen, denen ein Dollarzeichen vorangestellt ist, z. B. $"Hello, world".

Wenn bash -D wie Sie ohne Eingabe ausgeführt wird, gibt nichts aus und startet eine neue Shell (eine spezielle Shell, siehe unten.)

Zum Beispiel für dieses einfache Skript /tmp/script:

#!/bin/bash echo $"Hello, world" 

bash -D gibt aus:

"Hello, world" 

Wie Sie sehen, entspricht dies der Suche nach Zeilen, die mit $"<text>" übereinstimmen, und dem Entfernen des Dollarzeichens.

Interessanter ist die Ausgabe der ähnlichen Option --dump-po-strings, die, wie die Bash-Manpage sagt, equivalent to -D, but the output is in the GNU gettext po (portable object) file format.:

bash --dump-po-strings /tmp/script #: /tmp/script:2 msgid "Hello, world" msgstr "" 

Dieser ausgezeichnete Artikel So fügen Sie Ihren Bash-Skripten Lokalisierungsunterstützung hinzu bietet weitere Informationen zur Verwendung dieser Option.

bash -D führt mich in eine neue Shell, die anscheinend funktioniert haben weniger Funktionalität als die ursprüngliche Shell

Richtig, die neue Shell reagiert nicht auf Befehle. Der Grund dafür ist, dass die Option -D -n impliziert, Dadurch wird die Shell angewiesen, Befehle zu lesen, aber nicht auszuführen .

Die -n Option verdient eine Erklärung: Obwohl es auf den ersten Blick eine scheinbar nutzlose Option ist, ist sie tatsächlich sehr nützlich. bash -n liest Befehle nicht nur, sondern validiert sie auch und beschwert sich, wenn die Syntax nicht gültig ist. Sie können also bash -n <script name> ausführen, um ein Skript zu überprüfen Für Syntaxfehler ohne Ausführung eines Befehls.

Dies bedeutet, dass die Shell, die Sie erhalten, nach Ausführung von bash -D Ihre Befehle gerne akzeptiert und die Gültigkeit (und Ausgabe) der Syntax überprüft ggf. einen Fehler) und nichts tun. Aus diesem Grund funktioniert which „nicht“.

Siehe Bash aufrufen und In den Abschnitten „Set Builtin “ des Bash-Referenzhandbuchs finden Sie Hintergrundinformationen zu diesem Verhalten.

Kommentare

  • Sehr informativ. Vielen Dank.
  • Ich bin hier gelandet, als ich versucht habe, eine .sh-Datei mit der ersten Zeile zu verstehen: #!/bin/bash -D Die -D Option scheint in diesem Zusammenhang ignoriert zu werden. Kann jemand kommentieren, ob diese Verwendung tatsächlich jemals gerechtfertigt ist oder nicht?
  • @iwolf Interessant, ich kann es mir nur als einen schnellen Weg vorstellen, " zu deaktivieren " ein Skript ohne Änderung der ausführbaren Bits (dh das Skript hätte immer noch den Modus 755 / rwxr-xr-x, tut aber nichts). Andernfalls sehe ich ' nicht, wie dies überhaupt jemals nützlich sein könnte. In meinen Tests bewirkt ein solches Skript nichts (außer das Drucken lokalisierbarer Zeichenfolgen, dh Zeichenfolgen in doppelten Anführungszeichen, denen ein Dollarzeichen vorangestellt ist).

Antwort

Es ist beabsichtigt, alle lokalisierbaren Zeichenfolgen zu extrahieren, ohne das Skript auszuführen, aber es ist selbst für diesen begrenzten Zweck nicht sehr nützlich, und ich glaube, es ist seit langem veraltet. Wenn Sie möchten, dass es etwas bewirkt:

% printf "foo\n\$\"bar\"\n" | bash -D "bar" 

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.