“ bash -D ” kommandoen ser ikke ut til '

Jeg kommer endelig til å bli bedre kjent med skallet etter alle disse årene. Jeg utforsket mannesiden for bash og ser på -D alternativet, som ifølge håndboken:

  -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å Mac-en min genererer den imidlertid ingen utdata og dumper meg til et nytt skall som ser ut til å ha mindre funksjonalitet enn det opprinnelige skallet; which -kommandoen sluttet å fungere i dette nye skallet.

Bare lurer på om noen kan gi innsikt i hva dette alternativet er for på Mac-en. Jeg bruker sannsynligvis feil, jeg er sikker.

Svar

På min mac, bash -D genererer ingen utdata

bash -D (og det tilsvarende lange alternativet --dump-strings) leser kommandoer fra standardinngang eller en fil og trekker ut strenger merket som oversettelig , det vil si dobbel siterte strenger som er foran et dollartegn, som $"Hello, world".

Hvis bash -D kjøres uten inngang, som du gjorde, gir den ingenting og starter et nytt skall (et spesielt skall, se nedenfor.)

For eksempel, for dette enkle skriptet /tmp/script:

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

bash -D utganger:

"Hello, world" 

Som du ser tilsvarer dette å søke etter linjer som samsvarer med $"<text>" og fjerne dollartegnet.

Mer interessant er utdataene fra det lignende alternativet --dump-po-strings, som er, som Bash-mansiden uttrykker 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 utmerkede artikkelen Slik legger du til lokaliseringsstøtte til dine bash-skript gir mer informasjon om hvordan du bruker dette alternativet.

bash -D dumper meg inn i et nytt skall som ser ut til å har mindre funksjonalitet enn det originale skallet

Det stemmer, det nye skallet reagerer ikke på noen kommandoer. Årsaken til dette er at -D alternativet innebærer -n , som leder skallet til å lese kommandoer, men ikke utføre dem .

-n alternativet fortjener en forklaring: selv om et tilsynelatende ubrukelig alternativ ved første øyekast, er det faktisk ganske nyttig. bash -n leser ikke bare kommandoer, men validerer dem og klager hvis syntaksen ikke er gyldig, så du kan kjøre bash -n <script name> for å sjekke et skript for syntaksfeil uten å utføre noen kommando.

Dette betyr at etter at bash -D er utført, vil skallet du får med glede godta kommandoene dine, se etter syntaksgyldighet (og utdata en feil om nødvendig) og gjør ingenting. Det er derfor which «ikke virker».

Se Påkalle Bash og Set Builtin -delene i referansehåndboken for Bash for litt informasjon om denne oppførselen.

Kommentarer

  • Veldig informativ. Takk.
  • Jeg havnet her mens jeg prøvde å gi mening om en .sh-fil med denne første linjen: #!/bin/bash -D -D alternativ synes å bli ignorert i denne sammenhengen. Kan noen kommentere om denne bruken noen gang er berettiget eller ikke?
  • @iwolf Interessant, jeg kan bare tenke på det som en rask måte å " deaktivere " et skript uten å endre de kjørbare bitene (det vil si at skriptet fremdeles vil ha modus 755 / rwxr-xr-x, men ikke gjør noe). Ellers ser jeg ikke ' hvordan dette i det hele tatt kan være nyttig. I testene mine gjør et slikt skript ingenting (bortsett fra å trykke lokaliserbare strenger, det vil si dobbel siterte strenger som er innledet med et dollartegn). >

    Det er ment å trekke ut alle lokaliserbare strenger uten å kjøre skriptet, men det er ikke veldig nyttig selv for det begrensede formålet, og jeg tror det lenge har blitt avskrevet. Hvis du vil se at det gjør noe:

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

    Kommentarer

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *