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
- Idézés a megszüntetéshez? Nem hiszem, hogy ' szerintem elavult.