Ajout de chemins à PATH à l'aide d'une syntaxe multiligne

16

Pour autant que je sache, la manière habituelle d'ajouter un chemin à la PATHvariable d'environnement est de concaténer des chemins séparés par le :caractère.

Par exemple, si je veux ajouter trois chemins à lui /my/path/1, /my/path/2et /my/path/3, je dois le faire comme suit:

PATH=$PATH:/my/path/1:/my/path/2:/my/path/3

ce qui n'est pas facile à lire.

Existe-t-il un moyen de définir ou d' ajouter des chemins à la PATHvariable à l'aide d'une syntaxe multiligne ? Peut-être en utilisant des tableaux? Je cherche quelque chose comme ça:

PATH = 
$PATH
/my/path/1
/my/path/2
/my/path/3

Dans le cas où il existe des solutions intéressantes spécifiques au shell, je recherche une solution en zsh.

Amelio Vazquez-Reina
la source

Réponses:

12

Je ne sais pas si cela fonctionne en zsh, mais cela fonctionne en bash:

PATH=$(paste -d ":" -s << EOF 
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF
)

Modifier et encore plus court:

PATH=`paste -d ":" -s << EOF 
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF`

Et sans engendrer un processus:

new_path=(
"$PATH"
/my/path/1
/my/path/2
/my/path/3)
OLD_IFS="$IFS"
export IFS=":"
PATH="${new_path[*]}"
export IFS="$OLD_IFS"

Les guillemets doubles sont arround importantes $PATH, $IFS, ${new_path[*]}et $OLD_IFSde garder des espaces dans les variables et éviter l' interprétation shell de l' IFS.

Update2 avec commentaires et gestion des lignes vides avec sed:

PATH=`sed -e '/^#/'d -e '/^$/'d << EOF | paste -d ":" -s 
$PATH
/my/path/1
# This is a comment.
/my/path/2

/my/path/3
EOF`

Le caractère de commentaire doit être le premier caractère de la ligne et les lignes vides doivent être complètement vides. Pour gérer les espaces et les tabulations avant le commentaire et sur les lignes vides, utilisez sed -e '/^[ \t]*#/'d -e '/^[ \t]*$/'dplutôt (tabulations à tester car il peut être spécifique à l'implémentation sed).

jfg956
la source
J'ai testé le dernier extrait dans zsh et cela fonctionne. J'aime aussi que ce soit un peu plus propre (un chemin par ligne) que les autres solutions. La solution peut-elle accueillir des lignes (chemins) commentées? Et les lignes vides?
Amelio Vazquez-Reina
Mise à jour avec commentaires et gestion des lignes vides.
jfg956
Et avec sed, si vous voulez jouer, vous pouvez éviter le processus de collage avec un script plus compliqué.
jfg956
Est-il correct d'utiliser l'indentation pour les chemins dans la pastesolution?
void.pointer
20

Pas une solution intéressante du tout, mais très portable:

PATH=${PATH}:/my/path/1
PATH=${PATH}:/my/path/2
PATH=${PATH}:/my/path/3
Tapis
la source
1
C'est typique de ce que j'ai vu au fil des ans. On peut facilement réorganiser les chemins ou même changer un élément pour qu'il devienne PATH = / my / path / 1: $ {PATH} pour forcer l'ajout.
bsd
1
Vous pouvez également utiliser +=pour éviter d'avoir à reconstruire complètement la chaîne.
Chris Down
Et vous n'avez même pas besoin d'utiliser les accolades. Les deux-points ne peuvent pas être utilisés dans les noms de variables d'environnement, il n'y a donc aucune ambiguïté à résoudre.
Alexios
+1 pour ne pas être intéressant. Intéressant peut être bon parfois, mais ce n'est pas un de ces moments! (D'autant plus que le PO a explicitement mentionné "pas facile à lire" comme problème.)
ruakh
@ChrisDown Y a-t-il une syntaxe qui précède sans reconstruire la chaîne?
John P
12

Dans zsh, $pathest un tableau:

path=(
    $path
    ~/.local/bin
    ~/.gem/ruby/2.0.0/bin
)

Remarque: les deux pathsont en minuscules.

Kabie
la source
Cela dépend du shell, tous ne le gèrent pas.
vonbrand
1
@vonbrand: Oui, mais fonctionne en zsh. Je pense qu'il vaut la peine de le mentionner.
Kabie
3
+1 (Cette question est étiquetée zsh )
Johnsyweb
Puisque l'OP a spécifiquement posé des questions sur zsh, c'est la meilleure option
Daniel Serodio
1
pour tous ceux qui souhaitent en savoir plus sur la distinction $ path vs. $ PATH, consultez cet article
mbigras
7

Dans zsh, si vous ajoutez des répertoires à la fin du chemin:

path+=/my/path/1
path+=/my/path/2
path+=(/path/to/app/{i386,share}/bin)

Portablement: Comment ajouter correctement un chemin d'accès à PATH?

Vous pouvez utiliser des qualificatifs glob pour exclure des entrées qui ne sont pas des répertoires existants ou des liens symboliques vers ceux-ci. Cela peut être souhaitable ou non, selon que vous vous attendez à ce que les répertoires soient ajoutés ultérieurement au cours de la session (par exemple, s'ils se trouvent sur des systèmes de fichiers distants). Vous ne pouvez pas faire cela avec la path+=/my/pathsyntaxe car le côté droit est dans un contexte de chaîne et ne subit donc pas de globalisation; vous pouvez le faire avec path+=(/my/path)puisque chaque élément de tableau est développé dans un contexte de liste.

path+=(/path/to/app/{i386,share}/bin(-/N))
Gilles 'SO- arrête d'être méchant'
la source