“ bash -D ” kommando ser ikke ud til '

Jeg er endelig ved at blive mere fortrolig med skallen efter alle disse år. Jeg udforskede mandsiden til bash og ser på indstillingen -D, som ifølge manualen:

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

På min mac genererer den imidlertid ingen output og dumper mig i en ny shell, der ser ud til at have mindre funktionalitet end den originale shell; which kommandoen stoppede med at arbejde i denne nye shell.

Bare spekulerer på, om nogen kan tilbyde indsigt i, hvad denne mulighed er til på macen. Jeg bruger sandsynligvis den forkert, jeg er sikker.

Svar

På min mac bash -D genererer intet output

bash -D (og den tilsvarende lange valgmulighed --dump-strings) læser kommandoer fra standardinput eller en fil og udtrækker strenge markeret som oversættelig , det vil sige dobbeltciterede strenge, der er forud for et dollartegn, som $"Hello, world".

Hvis bash -D køres uden nogen input, som du gjorde, udgiver det intet og starter en ny shell (en speciel skal, se nedenfor.)

For eksempel for dette enkle script /tmp/script:

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

bash -D udgange:

"Hello, world" 

Som du ser svarer det til at søge efter linjer, der matcher $"<text>" og fjerne dollartegnet.

Mere interessant er output af den lignende mulighed --dump-po-strings, som er, som Bash-mandsiden udtrykker det, 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 "" 

Denne fremragende artikel Sådan tilføjes lokaliseringsstøtte til dine bash-scripts giver mere information om, hvordan du bruger denne mulighed.

bash -D dumper mig ned i en ny skal, der ser ud til har mindre funktionalitet end den originale shell

Det er rigtigt, den nye shell reagerer ikke på nogen kommandoer. Årsagen til dette er, at -D muligheden indebærer -n , som leder shell til at læse kommandoer, men ikke udføre dem .

-n mulighed fortjener en forklaring: selvom en tilsyneladende ubrugelig mulighed ved første øjekast, er den faktisk ret nyttig. bash -n læser ikke kun kommandoer, men validerer dem og klager, hvis syntaksen ikke er gyldig, så du kan køre bash -n <script name> for at kontrollere et script for syntaksfejl uden at udføre nogen kommando.

Dette betyder, at efter udførelse af bash -D, vil den shell, du får, med glæde acceptere dine kommandoer, kontrollere syntaksgyldighed (og output en fejl, hvis det er nødvendigt) og gør ingenting. Derfor fungerer which “ikke.

Se Påkalder Bash og Sættet indbygget i Bash Reference Manual for nogle baggrundsoplysninger om denne adfærd.

Kommentarer

  • Meget informativ. Tak.
  • Jeg endte her, mens jeg prøvede at give mening .sh-fil med denne første linje: #!/bin/bash -D -D option synes at blive ignoreret i denne sammenhæng. Kan nogen kommentere, om denne brug faktisk nogensinde er berettiget eller ej?
  • @iwolf Interessant, jeg kan kun tænke på det som en hurtig måde at " deaktivere " et script uden at ændre de eksekverbare bits (det vil sige, at scriptet stadig har tilstand 755 / rwxr-xr-x men ikke gør noget). Ellers ser jeg ikke ' hvordan dette overhovedet kan være nyttigt. I mine tests gør et sådant script intet (undtagen udskrivning af lokaliserede strenge, det vil sige dobbeltciterede strenge, der er forud for et dollartegn).

Svar

Det er beregnet til at udtrække alle lokaliserbare strenge uden at køre scriptet, men det er ikke meget nyttigt selv til det begrænsede formål, og jeg tror, det er længe blevet forældet. Hvis du vil se, at det gør noget:

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

Kommentarer

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *