Apa arti $ {PATH: +: $ {PATH}}?

25

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?

tofutim
sumber
1
Judul pertanyaan Anda benar-benar kacau dengan pemformatan di bilah sisi Pertanyaan Populer SE i.imgur.com/g6pPmzf.png
Brad

Jawaban:

39

Ini :+adalah bentuk ekspansi parameter :

$ {parameter: + [word]} : Gunakan Nilai Alternatif.

Jika parameter tidak disetel atau nol, null harus diganti; jika tidak, perluasan kata (atau string kosong jika kata dihilangkan) harus diganti.

Dengan kata lain, jika variabel $vardidefinisikan, echo ${var:+foo}akan dicetak foodan, 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:

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

Ini hanya trik pintar untuk menghindari penambahan ekstra :saat $PATHtidak disetel. Sebagai contoh:

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

Tetapi jika PATHtidak disetel:

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

A :dengan sendirinya menambahkan direktori saat ini ke $PATH. Menggunakan PATH="/new/dir${PATH:+:$PATH}"menghindari ini. Jadi yakin, Anda dapat menggunakan PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"jika Anda mau, atau Anda dapat menggunakan PATH="$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.

terdon
sumber
Apakah ekstra :berbahaya?
kucing
4
@tac tidak juga, itu hanya menambahkan direktori saat ini ke Anda $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 menamakannya lsatau sesuatu) tetapi dalam kebanyakan kasus, Anda benar-benar tidak keberatan. Bahkan, beberapa sistem menambahkan direktori saat ini ke PATHsecara default pula.
terdon
jalan adalah satu tempat di mana saya lebih suka cara mereka cshmenangani kemudian sebagai array.
hometoast
8

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:

   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.
          ...

Mungkin itu bukan yang ingin Anda lakukan.

Dua baris berikut melakukan hal yang sama:

PATH=":/bin"        # search current directory, then /bin
PATH=".:/bin"
AndyB
sumber