A “ bash -D ” parancs nem úgy tűnik, hogy ' nem csinál semmi hasznosat

Végül megismerkedtem azzal, hogy jobban megismerjem a héjat ennyi év után. A bash és megnézi a -D opciót, amely a kézikönyv szerint:

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

Azonban a Mac gépemen nem generál kimenetet, és egy új shellbe dob, amely úgy tűnik, hogy kevésbé funkcionális, mint az eredeti shell; a which parancs nem működött ebben az új shellben.

Csak arra kíváncsi, hogy tud-e valaki betekintést nyújtani abba, hogy ez a lehetőség mire szolgál a mac-on. Valószínűleg rosszul használom, biztos vagyok benne.

Válasz

Mac gépemen bash -D nem generál kimenetet

bash -D (és ennek megfelelő hosszú opció --dump-strings) beolvassa a parancsokat a standard bemenetből vagy egy fájlból, és kivonja a karakterláncokat fordíthatónak jelölve , vagyis dupla idézőjelű karakterláncok, amelyek előtt dollárjel áll, például $"Hello, world".

Ha a bash -D fájlt futtatja minden bemenet nélkül, ahogy te tetted, akkor a semmit nem ad ki, és új héjat indít “>

(egy speciális shell, lásd alább.)

Például ehhez az egyszerű szkripthez /tmp/script:

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

bash -D kimenetek:

"Hello, world" 

Amint látja, ez egyenértékű a $"<text>" egyezésű vonalak keresésével és a dollárjel eltávolításával.

Érdekesebb a hasonló opció kimenete: --dump-po-strings, amely – ahogyan a Bash man oldal mondja – 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 "" 

Ez a kiváló cikk A lokalizációs támogatás hozzáadása a bash szkriptekhez további információt nyújt az opció használatáról.

bash -D egy új héjba sodor, amely úgy tűnik, hogy kevesebb funkcionalitással rendelkezik, mint az eredeti héj

Így van, az új héj nem reagál semmilyen parancsra. Ennek az az oka, hogy a -D opció -n , amely a héjat utasítja a parancsok elolvasására, de nem végrehajtja őket .

A “>

opció magyarázatot érdemel: bár első ránézésre látszólag haszontalan lehetőség, valójában elég hasznos. Az bash -n nemcsak elolvassa a parancsokat, hanem érvényesíti is azokat, és panaszkodik, ha a szintaxis nem érvényes, ezért futtathatja a bash -n <script name> parancsfájlt szintaxishibákhoz parancs végrehajtása nélkül.

Ez azt jelenti, hogy a bash -D végrehajtása után a kapott shell boldogan elfogadja a parancsokat, ellenőrzi a szintaxis érvényességét (és a kimenetet ha szükséges hiba), és ne tegyen semmit. Ezért which “nem működik”.

Lásd: Bash hívása és A Bash Referencia kézikönyv Beépített készlet szakaszai néhány háttérinformációt tartalmaznak erről a viselkedésről.

Megjegyzések

  • Nagyon informatív. Köszönöm.
  • Itt kötöttem ki, miközben ezzel az első sorral próbáltam értelmezni egy .sh fájlt: #!/bin/bash -D A -D opciót úgy tűnik, hogy ebben az összefüggésben figyelmen kívül hagyják. Valaki tudna megjegyzést fűzni ahhoz, hogy ez a használat valóban indokolt-e vagy sem?
  • @iwolf Érdekes, csak arra gondolok, hogy " letiltsa " egy szkript a futtatható bitek megváltoztatása nélkül (vagyis a szkriptnek továbbra is 755 / rwxr-xr-x módja lenne, de nem csinál semmit). Ellenkező esetben nem látom ', hogy ez valaha is hasznos lehet. Tesztjeim során egy ilyen szkript nem csinál semmit (kivéve a lokalizálható karakterláncok kinyomtatását, vagyis a dupla idézőjelű karakterláncokat, amelyek előtt dollárjel áll). >

    Az összes lokalizálható karakterláncot ki szeretné szedni anélkül, hogy a parancsfájlt futtatná, de ez még csak korlátozott célokra sem nagyon hasznos, és úgy gondolom, hogy régóta elavult. Ha szeretné látni, hogy csinál valamit:

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

    Megjegyzések

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük