Sto finalmente prendendo confidenza con la shell dopo tutti questi anni. Stavo esplorando la pagina man per bash
e guardando lopzione -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 which
ha smesso di funzionare in questa nuova shell.
Mi chiedevo solo se qualcuno possa offrire informazioni su a cosa serve questa opzione su Mac. Probabilmente lo sto usando in modo sbagliato, ne sono sicuro.
Risposta
Sul mio Mac,
bash -D
non genera alcun output
bash -D
(e la sua opzione lunga equivalente --dump-strings
) legge i comandi dallo standard input o da un file ed estrae le stringhe contrassegnata come traducibile , ovvero stringhe tra virgolette doppie precedute dal segno del dollaro, come $"Hello, world"
.
Se bash -D
viene eseguito senza alcun input, come hai fatto tu, non restituisce nulla e avvia una nuova shell (una shell speciale , vedi sotto.)
Ad esempio, per questo semplice script /tmp/script
:
#!/bin/bash echo $"Hello, world"
bash -D
restituisce:
"Hello, world"
Come vedi, ciò equivale a cercare le righe che corrispondono a $"<text>"
e rimuovere il simbolo del dollaro.
Più interessante è loutput dellopzione 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 ai tuoi script bash fornisce ulteriori informazioni su come utilizzare questa opzione.
bash -D
mi scarica in una nuova shell che sembra hanno meno funzionalità della shell originale
Esatto, la nuova shell non reagisce a nessun comando. Il motivo è che lopzione -D
implica -n
, che indica alla shell di leggere i comandi ma non di eseguirli .
Il merita una spiegazione: sebbene sia unopzione 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 errori di sintassi senza eseguire alcun comando.
Ciò significa che dopo aver eseguito bash -D
, la shell che otterrai accetterà felicemente i tuoi comandi, verificherà la validità della sintassi (e loutput un errore se necessario) e non fare nulla. Ecco perché which
“non” funziona “.
Vedi Invocare Bash e Le sezioni Set Builtin del Manuale di riferimento di Bash per alcune informazioni di base su questo comportamento.
Commenti
- Molto informativo. Grazie.
- Sono finito qui mentre cercavo di dare un senso a un file .sh con questa prima riga:
#!/bin/bash -D
Il-D
sembra venga ignorata in questo contesto. Qualcuno può commentare se questo utilizzo è effettivamente mai garantito o no? - @iwolf Interessante, posso solo considerarlo un modo rapido per " disabilitare " uno script senza modificare i bit eseguibili (ovvero, lo script avrebbe ancora la modalità 755 / rwxr-xr-x ma non fa nulla). Altrimenti, non ' vedo come questo potrebbe essere mai utile. Nei miei test, uno script di questo tipo non fa nulla (tranne la stampa di stringhe localizzabili, cioè stringhe tra virgolette doppie precedute dal segno del dollaro).
Risposta
Ha lo scopo di estrarre tutte le stringhe localizzabili senza eseguire lo script, ma non è molto utile anche per questo scopo limitato e credo che sia stato a lungo deprecato. Se vuoi vederlo fare qualcosa:
% printf "foo\n\$\"bar\"\n" | bash -D "bar"
Commenti
- Citazione per deprecazione? Non ' penso che sia obsoleto.