“ bash -D ” comanda nu pare să facă nimic util

În sfârșit mă pregătesc să mă familiarizez cu shell-ul după toți acești ani. Exploram pagina de manual pentru bash și privind opțiunea -D, care, conform manualului:

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

Cu toate acestea, pe Mac-ul meu nu generează nicio ieșire și mă aruncă într-un shell nou care pare să aibă mai puține funcționalități decât shell-ul original; which a încetat să mai funcționeze în acest nou shell.

Întrebându-mă doar dacă cineva poate oferi informații despre ce este această opțiune pe Mac. Probabil că o folosesc greșit, sunt sigur.

Răspuns

Pe computerul meu, bash -D nu generează nicio ieșire

bash -D (și opțiunea sa echivalentă lungă --dump-strings) citește comenzi din intrarea standard sau dintr-un fișier și extrage șiruri marcat ca traductibil , adică șiruri cu ghilimele duble care sunt precedate de un semn de dolar, cum ar fi $"Hello, world".

Dacă bash -D este rulat fără nicio intrare, așa cum ați făcut, nu produce nimic și pornește un shell nou (un shell special , vezi mai jos.)

De exemplu, pentru acest script simplu /tmp/script:

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

bash -D ieșiri:

"Hello, world" 

După cum vedeți, acest lucru este echivalent cu căutarea liniilor care se potrivesc cu $"<text>" și cu eliminarea semnului dolar.

Mai interesant este rezultatul opțiunii similare --dump-po-strings, care este, așa cum spune pagina de manual Bash, 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 "" 

Acest excelent articol Cum se adaugă suport de localizare scripturilor dvs. bash oferă mai multe informații despre cum să utilizați această opțiune.

bash -D mă aruncă într-un nou shell care pare să au mai puține funcționalități decât shell-ul original

Așa este, noul shell nu reacționează la nicio comandă. Motivul pentru aceasta este că opțiunea -D implică -n , care direcționează shell-ul să citească comenzile, dar să nu le execute .

merită o explicație: deși o opțiune aparent inutilă la prima vedere, este de fapt destul de utilă. bash -n nu numai că citește comenzi, dar le validează și se plânge dacă sintaxa nu este validă, deci puteți rula bash -n <script name> pentru a verifica un script pentru erori de sintaxă fără a executa nicio comandă.

Aceasta înseamnă că după executarea bash -D, shell-ul pe care îl primiți va accepta cu bucurie comenzile, verificați validitatea sintaxei (și ieșirea o eroare dacă este necesar) și nu faceți nimic. De aceea, which „nu funcționează”.

Consultați Invocând Bash și Secțiunile Set Builtin din Manualul de referință Bash pentru câteva informații de fundal despre acest comportament.

Comentarii

  • Foarte informativ. Mulțumesc.
  • Am ajuns aici în timp ce încercam să dau sens unui fișier .sh cu această primă linie: #!/bin/bash -D -D opțiunea pare ignorată în acest context. Poate cineva să comenteze dacă această utilizare este de fapt justificată sau nu?
  • @iwolf Interesant, pot să mă gândesc la asta doar ca o modalitate rapidă de a " dezactiva " un script fără a schimba biții executabili (adică scriptul ar avea în continuare modul 755 / rwxr-xr-x, dar nu face nimic). În caz contrar, nu ' nu văd cum ar putea fi deloc util acest lucru. În testele mele, un astfel de script nu face nimic (cu excepția tipăririi de șiruri localizabile, adică șiruri cu ghilimele duble care sunt precedate de un semn de dolar).

Răspuns

Se intenționează să extragă toate șirurile localizabile fără a rula scriptul, dar nu este foarte util chiar și pentru acest scop limitat și cred că a fost depreciat de mult timp. Dacă doriți să o vedeți făcând ceva:

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

Comentarii

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *