Apakah ada cara untuk menambahkan direktori ke PATH saya di zsh hanya jika belum ada?

15

Apakah ada cara mudah di zsh untuk menambahkan direktori ke PATH saya hanya jika belum ada? (atau, lebih umum, variabel lingkungan apa pun). Saya sudah mencoba:

PATH+=/my/directory

... tetapi jika itu dieksekusi dua kali, itu akan ditambahkan dua kali.

Andrew Ferrier
sumber
2
@uther, itu bukan duplikat karena pertanyaan lain adalah untuk bash, sedangkan yang ini adalah untuk zsh yang memiliki caranya sendiri untuk mengatasi masalah ini.
Stéphane Chazelas

Jawaban:

32

In zsh $PATHdiikat (lihat typeset -T) ke $patharray. Anda bisa memaksa array itu untuk memiliki nilai unik dengan:

typeset -U path

Dan kemudian, tambahkan path dengan:

path+=(~/foo)

Tanpa harus khawatir jika sudah ada di sana.

Untuk menambahkannya di depan, lakukan:

path=(~/foo "$path[@]")

atau:

path[1,0]=~/foo

jika ~/foosudah ada $pathyang akan memindahkannya ke depan.

Stéphane Chazelas
sumber
Bukankah maksud Anda typeset -Ug path? Ketika saya gunakan typeset -U pathdi ~/.zshrcfile saya , saya selalu mendapatkan kembali kesalahan tentang tidak ada yang ada di jalan saat zshrc berjalan
kalbasit
@ emxyzptlk, aneh. -gadalah untuk menghindari membatasi ruang lingkup, tetapi dalam ~/.zshrc, ruang lingkup sudah global. Juga, saya belum pernah melihat zshkeluhan tentang yang kosong $PATH(kecuali untuk perintah tidak ditemukan kesalahan tentunya).
Stéphane Chazelas
3

Tambahkan export -U PATH=~/foo${PATH:+:$PATH}ke salah satu file startup Anda. Hanya -Umenyimpan kemunculan pertama nilai dalam array atau :variabel terbatas tertentu seperti PATH.

llua
sumber
-3

Anda harus melakukan sesuatu seperti:

if echo $PATH | grep :newpath: ; then doIfPresent; else doIfMissing; fi

Ini hanya berfungsi jika newpathdibatasi oleh dua ':', perlu mempertimbangkan kasus ketika itu di awal atau akhir sama.

Urgh.

vonbrand
sumber
1
Anda dapat melakukannya di dalam shell, dengan hanya fitur Bourne / POSIX. Ini menghindari mengutip sakit kepala (setidaknya membuatnya echo "$PATH": selalu menempatkan tanda kutip ganda di sekitar substitusi variabel ). case ":$PATH:" in *:/new/directory:*) :;; *) PATH=$PATH:/new/directory;; esac
Gilles 'SO- stop being evil'