Çok satırlı bir sözdizimi kullanarak PATH'a yol ekleme


16

Anladığım kadarıyla, PATHortam değişkenine yol eklemenin genel yolu , :karakterle ayrılmış yolları birleştirmektir .

Örneğin, ben buna üç yolları eklemek istiyorsanız /my/path/1, /my/path/2ve /my/path/3bunu aşağıdaki gibi yapmak zorunda kalacak,:

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

ki bu okunması kolay değil.

Çok satırlı bir sözdizimi kullanarak değişken tanımlamak veya değişkenlere yol eklemek için bir yol var mı ? Belki de diziler mi kullanıyorsunuz? Ben böyle bir şey arıyorum:PATH

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

Kabuğa özgü ilginç çözümler varsa, zsh'de bir çözüm arıyorum.

Yanıtlar:


12

Ben zsh çalışır, ama bash çalışır bilmiyorum:

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

Düzenleyin ve daha da kısa:

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

Ve bir süreç yumurtlamadan:

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

Çift tırnak olan önemli civarı $PATH, $IFS, ${new_path[*]}ve $OLD_IFSIFS değişkenleri ve önlemek kabuk yorumlanmasında boşluk tutmak için.

Sed ile yorumlar ve boş satır yönetimi ile Update2 :

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`

Yorum karakteri satırdaki 1. karakter ve boş satırlar tamamen boş olmalıdır. Yorumlardan önce ve boş satırlarda boşlukları ve sekmeleri yönetmek için sed -e '/^[ \t]*#/'d -e '/^[ \t]*$/'dbunun yerine kullanın (sed uygulamasına özgü olabileceği için test edilecek sekmeler).


Son snippet'i zsh olarak test ettim ve işe yarıyor. Ayrıca diğer çözümlerden biraz daha temiz (hat başına bir yol) olmasını seviyorum. Çözüm yorum satırlarını (yolları) karşılayabilir mi? Boş çizgiler nasıl olur?
Amelio Vazquez-Reina

Yorumlar ve boş satır yönetimi ile güncelleyin.
jfg956

Ve sed ile oynamak istiyorsanız, daha karmaşık bir komut dosyasıyla yapıştırma işleminden kaçınabilirsiniz.
jfg956

pasteÇözeltideki yollar için girinti kullanmak uygun mudur ?
void.pointer

20

Hiç ilginç bir çözüm değil, ama çok taşınabilir:

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

1
Bu, yıllar boyunca gördüklerimin tipik bir örneğidir. Yolları kolayca yeniden sıralayabilir, hatta bir öğeyi PATH = / my / path / 1: $ {PATH} olacak şekilde değiştirmeye zorlayabilirsiniz.
bsd

1
+=Dizeyi tamamen yeniden oluşturmak zorunda kalmamak için de kullanabilirsiniz .
Chris Down

Ve diş tellerini kullanmanıza bile gerek yok. Sütunlar, ortam değişkeni adlarında kullanılamaz, bu nedenle çözülmesi gereken bir belirsizlik yoktur.
Alexios

+1 ilginç olmadığı için. İlginç bazen iyi olabilir, ama bu o zamanlardan biri değil! (Özellikle OP açıkça bir sorun olarak "okunması kolay değil" bahsetti.)
ruakh

@ChrisDown Dizeyi yeniden oluşturmadan devam eden bir sözdizimi var mı?
John P

12

Zsh'de $pathbir dizidir:

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

Not: her ikisi pathde küçük harftir.


Bu kabuğa bağlıdır, hepsi bununla başa çıkmaz.
vonbrand

1
@vonbrand: Evet, Ama zsh ile çalışıyor. Bahsetmeye değer olduğunu düşünüyorum.
Kabie

3
+1 (Bu soru zsh olarak etiketlenmiştir )
Johnsyweb

OP özellikle zsh hakkında sorduğundan, bu en iyi seçenektir
Daniel Serodio

1
$ path vs $ PATH ayrım hakkında daha fazla bilgi edinmek isteyen herkes için bu yazı
atın

7

Zsh'de, yolun sonuna dizin ekliyorsanız:

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

Portably: PATH'ye doğru bir yol nasıl eklenir?

Mevcut dizinler veya bunlara sembolik bağlantılar olmayan girişleri hariç tutmak için glob niteleyicileri kullanabilirsiniz . Bu, dizinlerin oturum sırasında daha sonra eklenmesini bekleyip beklemediğinize bağlı olarak (örneğin, uzak dosya sistemlerinde) istenebilir veya edilmeyebilir. path+=/my/pathSözdizimi ile bunu yapamazsınız çünkü sağ taraf bir dize bağlamındadır ve bu nedenle globbing yapılmaz; bunu, path+=(/my/path)her dizi öğesi bir liste bağlamında genişletildiğinden yapabilirsiniz.

path+=(/path/to/app/{i386,share}/bin(-/N))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.