$ {PATH: +: $ {PATH}} ne anlama geliyor?


24

Geçenlerde cygwin profilimde aşağıdakileri daha net bir şekilde fark ettim:

/usr/local/bin:/usr/bin${PATH:+:${PATH}}

Bunun anlamı ne? Neden sadece $ PATH değil? Bu bir '$ PATH varsa, sonra ekle: $ PATH' mi? Amacım emri değiştirmek ve cygwin yollarını pencere yolunun arkasına koymak. Geçmişte yapardım

$PATH:/usr/local/bin:/usr/bin

ama bu beni şaşırtıyor. Belki de yapmalıyım

PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"

eklemek için: $ PATH sonunda?


1
Soru başlığınız gerçekten SE Sıcak Sorular kenar çubuğundaki biçimlendirmeyle ilgili i.imgur.com/g6pPmzf.png
Brad

Yanıtlar:


38

:+Şeklidir parametre genişleme :

$ {parametre: + [kelime]} : Alternatif Değer kullanın.

Parametre ayarlanmamış veya boşsa, boş bırakılmalıdır; Aksi takdirde, kelimenin genişlemesi (veya eğer kelime kullanılmazsa boş bir dize) değiştirilmelidir.

Başka bir deyişle, değişken $vartanımlanmışsa echo ${var:+foo}yazdırır foove değilse, boş dizeyi yazdırır.

İkincisi :özel bir şey değil. İçindeki dizin listesinde ayırıcı olarak kullanılan karakterdir $PATH. Yani, PATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"kestirme bir yoldur:

if [ -z "$PATH" ]; then
    PATH=/usr/local/bin:/usr/bin
else
    PATH=/usr/local/bin:/usr/bin:$PATH
fi

Bu bir ekstra eklemekten kaçının sadece akıllı numara :zaman $PATHayarlı değil. Örneğin:

$ PATH="/usr/bin"
$ PATH="/new/dir:$PATH" ## Add a directory
$ echo "$PATH"
/new/dir:/usr/bin

Ama eğer PATHayarlanmamışsa:

$ unset PATH
$ PATH="/new/dir:$PATH"
$ echo "$PATH"
/new/dir:

A :, geçerli dizini tek başına ekler $PATH. PATH="/new/dir${PATH:+:$PATH}"Bunu kullanmak önler. Yani tabii PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"ki istersen kullanabilirsin ya da istersen kullanabilirsin PATH="$PATH:/usr/local/bin:/usr/bin". Tek fark, eski olanın fazladan ekleyebilmesi ve :böylece mevcut dizininizi de eklemektir $PATH.


Ekstra :zararlı mı?
kedi,

4
@tac gerçekten, sadece senin için geçerli dizin ekler $PATH(AndyB en @ bkz cevap ). Bu, bazı durumlarda güvenlik riski oluşturabilir (bir saldırganın mevcut dizininize yıkıcı bir komut dosyası yüklediğini ve adını lsya da bir şey söylediğini söyleyin ), ancak çoğu durumda, gerçekten sakıncası yoktur. Aslında, bazı sistemler mevcut dizini PATHzaten varsayılan olarak ekler .
terdon

yolu tek onlar yol tercih ediyorum yeri cshbir dizi olarak o zaman kolları.
hometoast

8

Haklısınız, '$ PATH varsa - ve null değil - sonra şunu ekleyin: $ PATH'.

$ PATH seçeneğinin mevcut olup olmadığını kontrol etmeniz gerekir, çünkü $ PATH tanımsızsa baştaki (veya sondaki) sütunu eklemek istemezsiniz. Yoldaki sıfır uzunluklu (boş) bir dizin adı :/usr/local/bin:/usr/bin, veya /usr/local/bin:/usr/bin:içinde veya /usr/local/bin::/usr/bin, geçerli dizini aramak anlamına gelir .

Şundan alıntı yapıldı man bash:

   PATH   ...
          A zero-length (null) directory name in the value of PATH indicates 
          the current directory.  A  null  directory name may appear as two 
          adjacent colons, or as an initial or trailing colon.
          ...

Muhtemelen yapmak istediğin şey bu değildir.

Aşağıdaki iki satır aynı şeyi yapar:

PATH=":/bin"        # search current directory, then /bin
PATH=".:/bin"
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.