Olen vihdoin tutustumassa kuoren tuntemiseen kaikkien näiden vuosien jälkeen. Tutkin bash
ja tarkastelemalla vaihtoehtoa -D
, joka käsikirjan mukaan:
-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.
Macissani se ei kuitenkaan tuota ulostuloa ja kaataa minut uuteen kuoreen, jolla näyttää olevan vähemmän toiminnallisuutta kuin alkuperäisellä kuorella; which
-komento lakkasi toimimasta tässä uudessa kuoressa.
Mietin vain, voisiko joku tarjota käsityksen siitä, mihin tämä vaihtoehto on tarkoitettu Macissa. Käytän sitä todennäköisesti väärin, olen varma.
Vastaa
Macissa
bash -D
ei tuota tulosta
bash -D
(ja vastaava pitkä vaihtoehto --dump-strings
) lukee komennot vakiotulosta tai tiedostosta ja purkaa merkkijonot merkitty käännettäväksi eli kaksoislainausmerkkijonoihin, joita edeltää dollarin merkki, kuten $"Hello, world"
.
Jos bash -D
suoritetaan ilman syötettä, kuten teitkin, se ei tuota mitään ja käynnistää uuden kuoren ”>
( erityinen kuori, katso alla.)
Esimerkiksi tälle yksinkertaiselle komentosarjalle /tmp/script
:
#!/bin/bash echo $"Hello, world"
bash -D
tuotokset:
"Hello, world"
Kuten näette, tämä vastaa rivejä, jotka vastaavat $"<text>"
, ja dollarin merkin poistamista.
Mielenkiintoisempi on vastaavan vaihtoehdon --dump-po-strings
tulos, joka on, kuten Bashin man-sivu sanoo, 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 ""
Tämä erinomainen artikkeli Kuinka lisätä lokalisointituki bash-skripteihisi tarjoaa lisätietoja tämän vaihtoehdon käytöstä.
bash -D
kaataa minut uuteen kuoreen, joka näyttää niillä on vähemmän toimintoja kuin alkuperäisellä komentotulkilla. Syy tähän on, että vaihtoehto-D
tarkoittaa-n
, joka ohjaa kuoren lukemaan komentoja, mutta ei suorittamaan niitä .
-n
-vaihtoehto ansaitsee selityksen: vaikka se on ensi silmäyksellä näennäisesti hyödytön vaihtoehto, se on itse asiassa varsin hyödyllinen.bash -n
ei vain lue komentoja, mutta myös validoi ne ja valittaa, jos syntaksin ei kelpaa, joten voit suorittaabash -n <script name>
tarkistaa komentosarjan syntaksivirheille suorittamatta komentoa.Tämä tarkoittaa, että suoritettuasi
bash -D
, saatu kuori hyväksyy komennot mielellään, tarkistaa syntaksin oikeellisuuden (ja lähdön) virhe tarvittaessa) ja älä tee mitään. Siksiwhich
”ei toimi”.Katso Bashin kutsuminen ja Bashin käyttöoppaan Set Builtin -osio sisältää joitain taustatietoja tästä toiminnasta.
Kommentit
- erittäin informatiivinen. Kiitos.
- Päädyin tänne yrittäessäni ymmärtää .sh-tiedostoa tällä ensimmäisellä rivillä:
#!/bin/bash -D
-D
-vaihtoehto näyttää ohitettavalta tässä yhteydessä. Voiko kukaan kommentoida, onko tämä käyttö todella perusteltua vai ei?- @iwolf Mielenkiintoista, voin ajatella sitä vain nopeana tapana " poistaa käytöstä " komentosarja muuttamatta suoritettavia bittejä (ts. komentosarjalla olisi edelleen tila 755 / rwxr-xr-x, mutta se ei tee mitään). Muuten en näe ', kuinka tästä voisi olla hyötyä ollenkaan. Testissäni tällainen komentosarja ei tee mitään (lukuun ottamatta lokalisoitavien merkkijonojen tulostamista, ts. Kaksinkertaisia lainausmerkkijonoja, joita edeltää dollarin merkki).
Vastaa
Sen tarkoituksena on purkaa kaikki lokalisoitavat merkkijonot suorittamatta komentosarjaa, mutta se ei ole kovin hyödyllinen edes tähän rajoitettuun tarkoitukseen, ja uskon sen olevan jo kauan vanhentunut. Jos haluat nähdä sen tekevän jotakin:
% printf "foo\n\$\"bar\"\n" | bash -D "bar"
Kommentit
- Viittaus vanhentumiseen? En ' usko, että se on vanhentunut.