Saya baru-baru memperhatikan hal berikut di profil cygwin saya, lebih tepatnya:
/usr/local/bin:/usr/bin${PATH:+:${PATH}}
Apa artinya? Mengapa tidak hanya $ PATH? Apakah ini 'jika $ PATH ada, lalu tambahkan: $ PATH'? Tujuan saya adalah untuk menukar urutan dan meletakkan jalur cygwin di belakang jalur windows. Di masa lalu saya akan melakukannya
$PATH:/usr/local/bin:/usr/bin
tapi ini membingungkan saya. Mungkin seharusnya saya lakukan
PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"
untuk menambahkan: pada akhir $ PATH?
shell
path
variable-substitution
tofutim
sumber
sumber
Jawaban:
Ini
:+
adalah bentuk ekspansi parameter :Dengan kata lain, jika variabel
$var
didefinisikan,echo ${var:+foo}
akan dicetakfoo
dan, jika tidak, itu akan mencetak string kosong.Yang kedua
:
tidak ada yang istimewa. Ini adalah karakter yang digunakan sebagai pemisah dalam daftar direktori di$PATH
. Jadi,PATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"
adalah cara menulis yang singkat:Ini hanya trik pintar untuk menghindari penambahan ekstra
:
saat$PATH
tidak disetel. Sebagai contoh:Tetapi jika
PATH
tidak disetel:A
:
dengan sendirinya menambahkan direktori saat ini ke$PATH
. MenggunakanPATH="/new/dir${PATH:+:$PATH}"
menghindari ini. Jadi yakin, Anda dapat menggunakanPATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"
jika Anda mau, atau Anda dapat menggunakanPATH="$PATH:/usr/local/bin:/usr/bin"
jika Anda mau. Satu-satunya perbedaan adalah bahwa yang pertama dapat menambahkan ekstra:
, sehingga menambahkan direktori Anda saat ini ke$PATH
.sumber
:
berbahaya?$PATH
(lihat jawaban @ AndyB ). Itu bisa menjadi risiko keamanan dalam beberapa situasi (misalnya penyerang telah mengunggah skrip yang merusak ke direktori Anda saat ini dan menamakannyals
atau sesuatu) tetapi dalam kebanyakan kasus, Anda benar-benar tidak keberatan. Bahkan, beberapa sistem menambahkan direktori saat ini kePATH
secara default pula.csh
menangani kemudian sebagai array.Anda benar, artinya 'jika $ PATH ada - dan bukan nol - maka tambahkan: $ PATH'.
Anda perlu memeriksa apakah $ PATH ada karena Anda tidak ingin menambahkan usus besar (atau tertinggal) jika $ PATH tidak terdefinisi. Nama direktori zero-length (null) di path, seperti pada
:/usr/local/bin:/usr/bin
, atau/usr/local/bin:/usr/bin:
, atau/usr/local/bin::/usr/bin
, berarti mencari direktori saat ini .Dikutip dari
man bash
:Mungkin itu bukan yang ingin Anda lakukan.
Dua baris berikut melakukan hal yang sama:
sumber