“ bash -D ” El comando no ' parece hacer algo útil

Finalmente me estoy familiarizando 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 un nuevo shell que parece tener menos funcionalidad que el shell original; el which dejó de funcionar en este nuevo shell.

Me pregunto si alguien puede ofrecer información sobre para qué sirve esta opción en Mac. Probablemente la esté usando mal, estoy seguro.

Responder

En mi Mac, bash -D no genera salida

bash -D (y su opción larga equivalente --dump-strings) lee comandos de una entrada estándar o un archivo y extrae cadenas marcados como traducibles , 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 y comienza un nuevo shell (un shell especial , ver más abajo).

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

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

bash -D salidas:

"Hello, world" 

Como puede ver, esto equivale 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 dice la página de manual de Bash, 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 sus scripts de bash proporciona más información sobre cómo utilizar esta opción.

bash -D me lanza a un nuevo shell que parece tienen menos funcionalidad que el 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 indica al shell que lea comandos pero no los ejecute .

El 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 un script para errores de sintaxis sin ejecutar ningún comando.

Esto significa que después de ejecutar bash -D, el shell que obtenga aceptará felizmente sus comandos, verificará la validez de la sintaxis (y la salida un error si es necesario) y no hacer nada. Por eso, which «no» funciona «.

Consulte Invocación de Bash y Las secciones Set Builtin del Manual de referencia de Bash para obtener información general sobre este comportamiento.

Comentarios

  • Muy informativo. Gracias.
  • Terminé aquí mientras intentaba darle sentido a un archivo .sh con esta primera línea: #!/bin/bash -D El -D opción parece ignorarse en este contexto. ¿Alguien puede comentar si este uso está realmente justificado o no?
  • @iwolf Interesante, solo puedo pensar en ello como una forma rápida de " deshabilitar " un script sin cambiar los bits ejecutables (es decir, el script todavía tendría el modo 755 / rwxr-xr-x pero no hace nada). De lo contrario, ' no veo cómo esto podría ser útil en absoluto. En mis pruebas, dicho script no hace nada (excepto imprimir cadenas localizables, es decir, cadenas entre comillas dobles que están precedidas por un signo de dólar).

Respuesta

Está destinado a extraer todas las cadenas localizables sin ejecutar el script, pero no es muy útil incluso para ese propósito limitado y creo que ha sido obsoleto durante mucho tiempo. Si quieres verlo haciendo algo:

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

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *