il comando "bash -D" non sembra fare nulla di utile

6

Finalmente riesco a familiarizzare con la shell dopo tutti questi anni. Stavo esplorando la pagina man per bash e osservando l'opzione -D , che, secondo il manuale:

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

Tuttavia, sul mio Mac non genera output e mi scarica in una nuova shell che sembra avere meno funzionalità della shell originale; il comando which ha smesso di funzionare in questa nuova shell.

Basta chiedersi se qualcuno può offrire informazioni su cosa questa opzione è per Mac. Probabilmente sto usando male, ne sono sicuro.

    
posta StevieD 20.08.2018 - 02:31
fonte

2 risposte

3

On my mac, bash -D generates no output

bash -D (e la sua equivalente opzione lunga --dump-strings ) legge i comandi dallo standard input o da un file ed estrae stringhe contrassegnato come traducibile , cioè stringhe con virgolette precedute da un segno di dollaro, come $"Hello, world" .

Se bash -D viene eseguito senza alcun input, come hai fatto, non genera nulla e avvia una nuova shell (una shell speciale , vedi sotto).

Ad esempio, per questo semplice script /tmp/script :

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

% output dibash -D:

"Hello, world"

Come vedi, è equivalente alla ricerca di linee che corrispondono a $"<text>" e rimuovendo il simbolo del dollaro.

Più interessante è l'output dell'opzione simile --dump-po-strings , che è, come dice la pagina man di 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 ""

Questo eccellente articolo Come aggiungere il supporto per la localizzazione agli script di bash fornisce ulteriori informazioni su come utilizzare questa opzione.

bash -D dumps me into a new shell that seems to have less functionality than the original shell

Esatto, la nuova shell non reagisce a nessun comando. La ragione di ciò è che l'opzione -D implica -n , che indirizza la shell a leggere i comandi ma non li esegue .

L'opzione -n merita una spiegazione: sebbene un'opzione apparentemente inutile a prima vista, è in realtà abbastanza utile. bash -n non solo legge i comandi ma li convalida e si lamenta se la sintassi non è valida, quindi puoi eseguire bash -n <script name> per controllare uno script per gli errori di sintassi senza eseguire alcun comando.

Ciò significa che dopo aver eseguito bash -D , la shell ottenuta accetta felicemente i tuoi comandi, verifica la validità della sintassi (e genera un errore se necessario) e non fa nulla. Ecco perché which "non funziona".

Vedi Invocazione di Bash e The Set Builtin sezioni del Manuale di riferimento di Bash per alcune informazioni di base su questo comportamento.

    
risposta data 20.08.2018 - 11:22
fonte
6

È inteso per estrarre tutte le stringhe localizzabili senza eseguire lo script, ma non è molto utile neanche per uno scopo limitato e credo che sia stato a lungo deprecato. Se vuoi vederlo fare qualcosa:

% printf "foo\n\$\"bar\"\n" | bash -D
"bar"
    
risposta data 20.08.2018 - 04:30
fonte

Leggi altre domande sui tag