“ bash -D ” commando lijkt niet ' iets nuttigs te doen

Ik “ben er eindelijk aan toe om na al die jaren meer vertrouwd te raken met de shell. Ik was de man-pagina aan het verkennen voor bash en kijkend naar de -D optie, die volgens de handleiding:

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

Op mijn mac genereert het echter geen uitvoer en dumpt het me in een nieuwe shell die minder functionaliteit lijkt te hebben dan de originele shell; de which commando werkt niet meer in deze nieuwe shell.

Ik vroeg me gewoon af of iemand inzicht kan bieden in waar deze optie voor is op de mac. Ik “gebruik het waarschijnlijk verkeerd, ik weet het zeker”.

Antwoord

Op mijn Mac bash -D genereert geen uitvoer

bash -D (en de equivalente lange optie --dump-strings) leest opdrachten uit standaardinvoer of een bestand en extraheert strings gemarkeerd als vertaalbaar , dat wil zeggen strings met dubbele aanhalingstekens die worden voorafgegaan door een dollarteken, zoals $"Hello, world".

Als bash -D zonder enige invoer wordt uitgevoerd, zoals u deed, geeft het niets weer en start het een nieuwe shell (een speciale shell, zie hieronder.)

Bijvoorbeeld, voor dit eenvoudige script /tmp/script:

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

bash -D uitgangen:

"Hello, world" 

Zoals u ziet, komt dit overeen met het zoeken naar regels die overeenkomen met $"<text>" en het verwijderen van het dollarteken.

Interessanter is de uitvoer van de vergelijkbare optie --dump-po-strings, wat, zoals de Bash-manpage het zegt, 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 "" 

Dit uitstekende artikel Hoe u lokalisatie-ondersteuning kunt toevoegen aan uw bash-scripts biedt meer informatie over het gebruik van deze optie.

bash -D dumpt me in een nieuwe shell die hebben minder functionaliteit dan de originele shell

Dat klopt, de nieuwe shell reageert niet op enig commando. De reden hiervoor is dat de -D optie impliceert -n , die de shell opdracht geeft om commandos te lezen, maar niet uit te voeren .

De -n optie verdient een uitleg: hoewel het op het eerste gezicht een nutteloze optie is, is het eigenlijk best handig. bash -n leest niet alleen commandos, maar valideert ze ook en klaagt als de syntaxis niet geldig is, dus je kunt bash -n <script name> uitvoeren om een script te controleren voor syntaxisfouten zonder een commando uit te voeren.

Dit betekent dat na het uitvoeren van bash -D, de shell die je krijgt met plezier je commandos accepteert, controleert op syntaxisvaliditeit (en een fout indien nodig) en niets doen. Dat is waarom which “niet” werkt “.

Zie Bash aanroepen en De Set Builtin -secties van de Bash Reference Manual voor wat achtergrondinformatie over dit gedrag.

Opmerkingen

  • Zeer informatief. Bedankt.
  • Ik kwam hier terecht toen ik probeerde een .sh-bestand te begrijpen met deze eerste regel: #!/bin/bash -D De -D optie lijkt te worden genegeerd in deze context. Kan iemand iets zeggen over of dit gebruik ooit gerechtvaardigd is of niet?
  • @iwolf Interessant, ik kan het alleen zien als een snelle manier om " uit te schakelen " een script zonder de uitvoerbare bits te wijzigen (dat wil zeggen, het script zou nog steeds modus 755 / rwxr-xr-x hebben, maar doet niets). Anders zie ik ' niet in hoe dit ooit nuttig zou kunnen zijn. In mijn tests doet zon script niets (behalve het afdrukken van lokaliseerbare strings, dat wil zeggen strings met dubbele aanhalingstekens die worden voorafgegaan door een dollarteken).

Antwoord

Het is bedoeld om alle lokaliseerbare strings te extraheren zonder het script uit te voeren, maar het is niet erg bruikbaar, zelfs niet voor dat beperkte doel, en ik denk dat het al lang verouderd is. Als je het iets wilt zien doen:

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

Reacties

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *