Menambahkan entri baru ke variabel PATH di ZSH

188

Saya menggunakan zsh dan saya mencoba menambahkan entri baru (/home/david/pear/bin ) ke PATHvariabel tetapi saya tidak tahu caranya.

Hal yang paling membingungkan saya adalah bahwa tidak ada referensi tunggal ke PATHvariabel dalam ~/.zshrcfile saya , tetapi melakukan echo $PATHpengembalian:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Jadi suatu PATHvariabel sedang diatur di suatu tempat.

David Barreto
sumber

Jawaban:

213

Di sini, tambahkan baris ini ke .zshrc:

export PATH=/home/david/pear/bin:$PATH

EDIT : Ini berfungsi, tetapi jawaban ony di bawah ini lebih baik, karena memanfaatkan antarmuka terstruktur yang disediakan ZSH untuk variabel seperti $PATH. Pendekatan ini standar untuk bash, tetapi sejauh yang saya tahu, tidak ada alasan untuk menggunakannya ketika ZSH memberikan alternatif yang lebih baik.

Linuxios
sumber
29
haha lupakan saja, saya pikir itu hanya perintah konsol tetapi menambahkan baris itu ke .zshrc melakukan trik. Terima kasih banyak!
David Barreto
1
.Zshrc saya sudah memiliki garis untuk ekspor PATH jadi saya menggantinya dengan yang dimodifikasi.
Zack Huston
6
Aku harus menghapus tanda kutip ganda di sekitar entri yaitu PATH="/home/david/pear/bin:/usr/bin:etc"untuk PATH=/home/david/pear/bin:/usr/bin:etcuntuk itu untuk tinggal di zshrc.
a7omiton
3
@taco, Anda bisa menggunakan $ HOME
mencargo
1
@DanielSpringer: Ya. Ketika Anda membuka sebuah shell yang diwarisi PATHdari proses induk yang memulainya, dan kemudian ketika dijalankan .zshrc(atau .bashrcatau apa pun), itulah yang memungkinkan Anda menambahkan hal-hal tambahan ke jalur itu.
Linuxios
224

Sebenarnya, menggunakan ZSH memungkinkan Anda untuk menggunakan pemetaan variabel lingkungan khusus. Jadi Anda bisa melakukan:

# append
path+=('/home/david/pear/bin')
# or prepend
path=('/home/david/pear/bin' $path)
# export to sub-processes (make it inherited by child processes)
export PATH

Bagi saya itu fitur yang sangat rapi yang dapat diperbanyak ke variabel lain. Contoh:

typeset -T LD_LIBRARY_PATH ld_library_path :
ony
sumber
16
Jawaban bagus. Dalam kasus saya, ~/.zshrcbersumber setelah .profile, dan menimpa semuanya .profile. Butuh beberapa saat menarik rambut saya untuk mengetahuinya.
Khanh Nguyen
1
Kasing tambahan tidak perlu parens kecuali jika Anda menambahkan lebih dari satu elemen. Itu juga sering tidak membutuhkan tanda kutip. Jadi cara sederhana dan singkat untuk menambahkan adalah
Micah Elliott
1
@SuperUberDuper, Anda harus memahami bahwa hampir semua shell unix hanya membaca file startup yang hampir sama dengan jika Anda mengetikkannya di shell secara interaktif. Mengenai file "rc" Anda mungkin menemukan jawaban yang menarik untuk pertanyaan ini
ony
6
Dimungkinkan untuk menghindari ekspor eksplisit dengan -xdan hanya menyisakan nilai-nilai unik dalam sebuah variabel dengan -U, titik dua dianggap secara default, sehingga dapat menjadi:typeset -TUx PATH path
Duka
2
@DanielSpringer, no. Jika Anda menginginkannya dalam istilah-istilah itu maka: path=(...)(tanpa referensi $pathatau $PATHdi dalam) menetapkan, path=(... $path)menambahkan , dan path+(...)menambahkan.
ony
40

Anda dapat menambahkan ke Anda PATHdengan cara minimal. Tidak perlu tanda kurung kecuali Anda menambahkan lebih dari satu elemen. Biasanya juga tidak perlu penawaran. Jadi cara sederhana dan singkat untuk menambahkan adalah:

path+=/some/new/bin/dir

Penggunaan umum

Maka pola umum untuk pengujian skrip / executable baru menjadi:

path+=$PWD/.
# or
path+=$PWD/bin

Sintaks huruf kecil ini digunakan pathsebagai larik , namun juga memengaruhi padanan pasangannya, PATH(di mana ia "terikat" melalui typeset).

(Perhatikan bahwa tidak :diperlukan / diinginkan sebagai pemisah .)

Informasi terkait

Memperlakukan pathcara ini (sebagai sebuah array) juga berarti: tidak perlu melakukan a rehash untuk mendapatkan perintah yang baru saja ditemukan.

Juga lihat vared pathsebagai cara dinamis untuk mengeditpath dan hal-hal lain.

Anda mungkin hanya tertarik pada pathpertanyaan ini, tetapi karena kita berbicara tentang ekspor dan array, perhatikan bahwa array umumnya tidak dapat diekspor.

Anda bahkan dapat mencegah PATHdari mengambil duplikat entri (lihat ini dan ini ):

typeset -U path
Micah Elliott
sumber
Bukankah seharusnya 'path + =: / foo / bar'? (dengan titik dua)
andrew lorien
1
@ andrewlorien Saya memperbarui jawabannya dengan perincian tentang pemisah usus besar.
Micah Elliott
Perhatikan bahwa jika ada komentar setelah path, maka kita perlu mengutip, seperti path+='my/path' # for fun. Sudah jelas jika Anda memiliki ruang, tetapi tidak terlalu banyak jika Anda memiliki komentar.
Franklin Yu
"(Perhatikan bahwa tidak: diperlukan / diinginkan sebagai pemisah.)" Ini hanya berlaku untuk huruf kecil path. Diperlukan pendahuluan :untuk PATH, sebagai berikut di .zshrc PATH+=:/Users/path/to/my/folder
Emmett R.
37

satu liner, tanpa membuka ~/.zshrcfile

echo -n 'export PATH=~/bin:$PATH' >> ~/.zshrc

atau

echo -n 'export PATH=$HOME/bin:$PATH' >> ~/.zshrc

Untuk melihat efeknya, lakukan source ~/.zshrcdi tab yang sama atau buka tab baru

Siva Praveen
sumber
1
Bekerja dengan baik pada OSX dengan Zsh shell.
Stryker
1
Bekerja seperti pesona!
Akbar Sha Ebrahim
14
  1. Jalur yang ditambahkan ke ~ / .zshrc

    sudo vi ~/.zshrc

    tambahkan jalur baru

    export PATH="$PATH:[NEW_DIRECTORY]/bin"
  2. Perbarui ~ / .zshrc

    Simpan ~ / .zshrc

    source ~/.zshrc

  3. Periksa PATH

    echo $PATH

saneryee
sumber
2
Inilah Bashcaranya.
CousinCocaine
13

OPSI 1: Tambahkan baris ini ke ~ / .zshrc:

export "PATH=$HOME/pear/bin:$PATH"

Setelah itu Anda perlu menjalankan source ~/.zshrcagar perubahan Anda mempengaruhi ATAU tutup jendela ini dan buka yang baru

OPSI 2: jalankan di dalam konsol terminal untuk menambahkan jalur ini hanya ke sesi jendela terminal saat ini. Ketika Anda menutup jendela / sesi, itu akan hilang.

Dimitar
sumber
Bisakah Anda menguraikan bagaimana jawaban ini berbeda dari jawaban yang sama yang diposting 5 tahun yang lalu ?
Franklin Yu
dalam jawaban ini tidak dikatakan bahwa Anda harus menambahkan baris kode ini ke file, jika Anda menjalankannya seperti itu hanya akan berubah di jendela saat ini dan ini tidak menjelaskan dalam jawaban asli
Dimitar