El comando "bash -D" no parece hacer nada útil

6

Finalmente me estoy acostumbrando a familiarizarme con el shell después de todos estos años. Estaba explorando la página de manual de bash y mirando la opción -D , que, según el manual:

   -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.

Sin embargo, en mi Mac no genera salida y me descarga en una nueva shell que parece tener menos funcionalidad que la shell original; el comando which dejó de funcionar en este nuevo shell.

Solo me pregunto si alguien puede ofrecer una idea de para qué es esta opción en el mac. Probablemente lo estoy usando mal, estoy seguro.

    
pregunta StevieD 20.08.2018 - 02:31

2 respuestas

3
  

En mi mac, bash -D no genera resultados

bash -D (y su opción larga equivalente --dump-strings ) lee comandos desde una entrada estándar o un archivo y extrae cadenas marcado como traducible , es decir, cadenas entre comillas dobles precedidas por un signo de dólar, como $"Hello, world" .

Si bash -D se ejecuta sin ninguna entrada, como lo hizo, no genera nada e inicia un nuevo shell (un special shell, vea más abajo).

Por ejemplo, para este simple script /tmp/script :

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

bash -D resultados:

"Hello, world"

Como puede ver, esto es equivalente a buscar líneas que coincidan con $"<text>" y eliminar el signo de dólar.

Más interesante es el resultado de la opción similar --dump-po-strings , que es, como la página de Bash man lo pone, 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 ""

Este excelente artículo Cómo agregar soporte de localización a tus scripts de bash proporciona más información sobre cómo usar esta opción.

  

bash -D me envía a una nueva shell que parece tener menos funcionalidad que la shell original

Eso es correcto, el nuevo shell no reacciona a ningún comando. La razón de esto es que la opción -D implica -n , que dirige al shell a leer comandos pero no a ejecutarlos .

La opción -n merece una explicación: aunque es una opción aparentemente inútil a primera vista, en realidad es bastante útil. bash -n no solo lee los comandos, sino que también los valida y se queja si la sintaxis no es válida, por lo que puede ejecutar bash -n <script name> para verificar si en un script hay errores de sintaxis sin ejecutar ningún comando.

Esto significa que después de ejecutar bash -D , el shell que obtenga aceptará con gusto sus comandos, verificará la validez de sintaxis (y generará un error si es necesario) y no hará nada. Es por eso que which "no funciona".

Consulte Invoking Bash y The Set Builtin del Manual de referencia de Bash para obtener información de fondo sobre este comportamiento.

    
respondido por el jaume 20.08.2018 - 11:22
6

Está diseñado para extraer todas las cadenas localizables sin ejecutar el script, pero no es muy útil incluso para ese propósito limitado y creo que hace mucho que está en desuso Si quieres verlo haciendo algo:

% printf "foo\n\$\"bar\"\n" | bash -D
"bar"
    
respondido por el psp 20.08.2018 - 04:30

Lea otras preguntas en las etiquetas