Quelle est la signification de $ {GZIP_BINDIR - '/ bin'} en bash?

13

Quelqu'un peut-il expliquer ce que signifie cette commande?

PATH="${GZIP_BINDIR-'/bin'}:$PATH"; export PATH
Rashmi Narahari
la source

Réponses:

19

${GZIP_BINDIR-'/bin'}est un bashmodèle d'expansion des paramètres. De man bash:

${parameter:-word}
              Use Default Values.  If parameter is unset or null, 
the expansion of word is substituted.  Otherwise, the  value  of parameter
is substituted.

Immédiatement avant cette partie, la page de manuel contient (merci à @jwodder de l'avoir notifié):

Omitting the colon results in a test only for a parameter that is unset.

Comme l'indique la page de manuel, elle définira la valeur par défaut de la variable GZIP_BINDIR. Si GZIP_BINDIRune valeur a déjà été définie (autre que null car vous n'utilisez pas :), cette valeur sera utilisée, sinon /binsera utilisée comme valeur de la variable GZIP_BINDIR.

D'un autre côté, si vous souhaitez également tester les valeurs nulles, utilisez ce modèle (inclure :):

${GZIP_BINDIR:-'/bin'}

Après cela, le $PATHsera étendu aux valeurs qu'il détenait auparavant. Donc, si PATHprécédemment:

/usr/sbin:/usr/bin

Maintenant, votre PATHvolonté (compte tenu du fait qu'elle GZIP_BINDIRn'est pas définie):

/bin:/usr/sbin:/usr/bin

export PATHle rendra PATHaccessible à tous les processus enfants.

heemayl
la source
« Je pense que vous avez manqué un :dans${GZIP_BINDIR-'/bin'} » Pas nécessairement. ${parameter-word}est également valide, mais ne semble pas figurer dans la page de manuel.
nyuszika7h
@ nyuszika7h Ouais .. je ne le savais pas avant .. étrange pourquoi ce n'est pas inclus dans la page de
manuel
Dans la page de manuel bash de mon ordinateur, le paragraphe juste au-dessus de la section :-indique: "Lorsque vous n'effectuez pas l'expansion de la sous-chaîne, en utilisant les formulaires documentés ci-dessous (par exemple :-), bash teste un paramètre non défini ou nul. Omettre les deux-points entraîne un test uniquement pour un paramètre non
défini
En remarque, vous pouvez combiner le réglage de PATHet le exportdans une seule commande comme suit:export PATH="${GZIP_BINDIR-'/bin'}:$PATH"
Paddy Landau
8

N'y a-t-il vraiment pas de deux-points avant le trait d'union à l'intérieur de l'extension des paramètres ${GZIP_BINDIR-'/bin'}?

Ce type de construction est presque toujours écrit avec deux points, comme dans ${GZIP_BINDIR:-'/bin'}ce qui signifie, "si $ GZIP_BINDIR est NULL ou non défini, définissez-le sur '/ bin'"

Cependant, la syntaxe que vous avez fournie est valide, mais rare. ${GZIP_BINDIR-'/bin'}(pas de deux-points) signifie, "si $ GZIP_BINDIR n'est pas défini, réglez-le sur '/ bin'". S'il est défini (a été déclaré) mais que rien ne lui est attribué (par exemple, il est NULL), rien ne sera inséré.

Il peut y avoir un bogue ici, car les deux points suivant la construction de la variable (...} :$ PATH ...) seront toujours insérés si $ GZIP_BINDIR est défini mais NULL. Comme cela ajouterait deux points au début de $ PATH, cela entraînera la recherche dans le répertoire courant en premier.

Cela est considéré par la plupart comme un problème de sécurité car il facilite l'exécution d'un programme malveillant portant le même nom que les commandes standard simplement en le plaçant dans le répertoire en cours.

Pour laisser $ PATH inchangé si $ GZIP_BINDIR est défini mais NULL (vide), la syntaxe correcte serait ${GZIP_BINDIR-'/bin:'}$PATH; export PATH

Pour laisser $ PATH inchangé si $ GZIP_BINDIR est non défini ou est défini mais NULL, la syntaxe correcte serait ${GZIP_BINDIR:-'/bin:'}$PATH; export PATH

DocSalvager
la source
2

Cette commande met à jour la variable PATH.

La PATHest une variable d'environnement spécifiant un ensemble de répertoires où se trouvent les programmes exécutables.

PATH="${GZIP_BINDIR-'/bin'}:$PATH";

Cela ajoute la valeur d'une autre variable GZIP_BINDIRsi vous quittez le PATH précédent sinon utilisez / bin à la place et ajoutez-le à PATH

export PATH

l'exportation est utilisée pour définir le CHEMIN disponible pour tous les processus enfants et sous-coquilles. Lisez ceci pour plus d'informations sur

Vous devez noter que ce n'est pas statique et que vous le perdrez une fois que vous aurez quitté votre shell.

Afin de rendre cette édition PATH permanente, vous devez ajouter ces lignes à votre .bashrc

gedit .bashrc

et ajoutez la ligne

export PATH="${GZIP_BINDIR-'/bin'}:$PATH"

puis exécutez la commande

source .bashrc
Maythux
la source
GZIP_BINDIR est la variable
Maythux
qu'est-ce qui ne va pas? Non, je ne l'ai pas fait? le mien est également sous
voté
Pourquoi downvoting?!
Maythux