“ bash -D ” commande doesn ' t semble faire quelque chose dutile

Je « suis enfin en train de me familiariser avec le shell après toutes ces années. Jexplorais la page de manuel pour bash et en regardant loption -D, qui, selon le manuel:

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

Cependant, sur mon mac, il ne génère aucune sortie et me vide dans un nouveau shell qui semble avoir moins de fonctionnalités que le shell dorigine; le which a cessé de fonctionner dans ce nouveau shell.

Je me demandais simplement si quelquun pouvait offrir un aperçu de ce à quoi sert cette option sur le mac. Je lutilise probablement mal, jen suis sûr.

Réponse

Sur mon Mac, bash -D ne génère aucune sortie

bash -D (et son option longue équivalente --dump-strings) lit les commandes à partir de lentrée standard ou dun fichier et extrait les chaînes marqué comme traduisible , cest-à-dire des chaînes entre guillemets doubles précédées dun signe dollar, comme $"Hello, world".

Si bash -D est exécuté sans aucune entrée, comme vous lavez fait, il ne produit rien et démarre un nouveau shell (un shell spécial , voir ci-dessous.)

Par exemple, pour ce script simple /tmp/script:

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

bash -D sorties:

"Hello, world" 

Comme vous le voyez, cela équivaut à rechercher des lignes qui correspondent à $"<text>" et à supprimer le signe dollar.

Plus intéressante est la sortie de loption similaire --dump-po-strings, qui est, comme le dit la page de manuel de 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 "" 

Cet excellent article Comment ajouter le support de localisation à vos scripts bash fournit plus dinformations sur lutilisation de cette option.

bash -D me décharge dans un nouveau shell qui semble ont moins de fonctionnalités que le shell original

Cest vrai, le nouveau shell ne réagit à aucune commande. La raison en est que loption -D implique -n , qui dirige le shell pour lire les commandes mais ne pas les exécuter .

Le mérite une explication: bien quapparemment inutile à première vue, elle est en fait très utile. bash -n ne lit pas seulement les commandes, mais les valide également et se plaint si la syntaxe nest pas valide, vous pouvez donc exécuter bash -n <script name> pour vérifier un script pour les erreurs de syntaxe sans exécuter de commande.

Cela signifie quaprès avoir exécuté bash -D, le shell que vous obtenez acceptera avec plaisir vos commandes, vérifiera la validité de la syntaxe (et affichera une erreur si nécessaire) et ne rien faire. Cest pourquoi which « ne fonctionne » pas « .

Voir Invoquer Bash et Les sections Set Builtin du manuel de référence de Bash pour quelques informations générales sur ce comportement.

Commentaires

  • Très instructif. Merci.
  • Jai fini ici en essayant de donner un sens à un fichier .sh avec cette première ligne: #!/bin/bash -D Le -D semble être ignorée dans ce contexte. Quelquun peut-il dire si cette utilisation est réellement justifiée ou non?
  • @iwolf Intéressant, je ne peux y voir quun moyen rapide de " désactiver " un script sans changer les bits exécutables (cest-à-dire que le script aurait toujours le mode 755 / rwxr-xr-x mais ne fait rien). Sinon, je ne ' pas voir comment cela pourrait être utile du tout. Dans mes tests, un tel script ne fait rien (sauf imprimer des chaînes localisables, cest-à-dire des chaînes entre guillemets doubles précédées dun signe dollar).

Réponse

Il est destiné à extraire toutes les chaînes localisables sans exécuter le script, mais ce nest pas très utile même dans ce but limité et je pense quil est obsolète depuis longtemps. Si vous voulez le voir faire quelque chose:

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

Commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *