“ bash -D ” -kommandot verkar inte ' gör något användbart

Jag är äntligen på väg att bli mer bekant med skalet efter alla dessa år. Jag undersökte mansidan för bash och titta på alternativet -D, enligt handboken:

  -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 genererar den dock ingen utdata och dumpar mig till ett nytt skal som verkar ha mindre funktionalitet än det ursprungliga skalet. which kommandot slutade fungera i det här nya skalet.

Jag undrar bara om någon kan ge insikt om vad det här alternativet är till på Mac. Jag använder förmodligen fel, jag är säker.

Svar

På min mac bash -D genererar ingen utdata

bash -D (och dess motsvarande långa alternativ --dump-strings) läser kommandon från standardinmatning eller en fil och extraherar strängar markerad som översättbar , det vill säga dubbelt citerade strängar som föregås av ett dollartecken, som $"Hello, world".

Om bash -D körs utan någon inmatning, som du gjorde, skickar den ingenting och startar ett nytt skal (ett special skal, se nedan.)

Till exempel, för detta enkla skript /tmp/script:

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

bash -D utgångar:

"Hello, world" 

Som du ser motsvarar detta att söka efter rader som matchar $"<text>" och ta bort dollartecknet.

Mer intressant är utdata från liknande alternativ --dump-po-strings, vilket är, som Bash man-sidan uttrycker 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 "" 

Denna utmärkta artikel Så här lägger du till lokaliseringsstöd till dina bash-skript ger mer information om hur du använder det här alternativet.

bash -D dumpar mig i ett nytt skal som verkar har mindre funktionalitet än det ursprungliga skalet

Det stämmer, det nya skalet reagerar inte på några kommandon. Anledningen till detta är att alternativet -D innebär -n , som leder skalet att läsa kommandon men inte köra dem .

-n alternativet förtjänar en förklaring: även om ett till synes värdelöst alternativ vid första anblicken är det faktiskt ganska användbart. bash -n läser inte bara kommandon utan validerar dem också och klagar om syntaxen inte är giltig, så du kan köra bash -n <script name> för att kontrollera ett skript för syntaxfel utan att utföra något kommando.

Det betyder att efter att bash -D har körts, kommer skalet du får med glädje att acceptera dina kommandon, kontrollera om syntaxens giltighet (och utdata ett fel om det behövs) och gör ingenting. Det är därför which ”inte fungerar”.

Se Anropa Bash och Avsnittet Set Builtin i referenshandboken för Bash för bakgrundsinformation om detta beteende.

Kommentarer

  • Mycket informativt. Tack.
  • Jag hamnade här när jag försökte förstå en .sh-fil med den här första raden: #!/bin/bash -D -D alternativ verkar ignoreras i detta sammanhang. Kan någon kommentera om denna användning faktiskt någonsin är motiverad eller inte?
  • @iwolf Intressant, jag kan bara tänka på det som ett snabbt sätt att " inaktivera " ett skript utan att ändra de körbara bitarna (det vill säga skriptet skulle fortfarande ha läge 755 / rwxr-xr-x men gör ingenting). Annars ser jag inte ' hur detta alls kan vara användbart. I mina tester gör ett sådant manus ingenting (förutom att skriva ut lokaliserbara strängar, det vill säga dubbelciterade strängar som föregås av ett dollartecken).

Svar

Den är avsedd att extrahera alla lokaliserbara strängar utan att köra skriptet, men det är inte särskilt användbart även för det begränsade ändamålet och jag tror att det länge har avskaffats. Om du vill se att det gör något:

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

Kommentarer

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *