Saya bertanya-tanya di mana jalur baru harus ditambahkan ke PATH
variabel lingkungan. Saya tahu ini dapat dicapai dengan mengedit .bashrc
(misalnya), tetapi tidak jelas bagaimana melakukan ini.
Cara ini:
export PATH=~/opt/bin:$PATH
atau ini?
export PATH=$PATH:~/opt/bin
PATH=$PATH:$HOME/.local/bin:$HOME/bin
, jalur lain dapat ditambahkan dengan memisahkan dengan: misalnyaPATH=$PATH:$HOME/.local/bin:$HOME/bin:/home/ec2-user/pear/bin
.Jawaban:
Hal-hal sederhana
atau
tergantung pada apakah Anda ingin menambahkan
~/opt/bin
di akhir (akan dicari setelah semua direktori lain, jika ada program dengan nama yang sama di beberapa direktori) atau di awal (harus dicari sebelum semua direktori lain).Anda dapat menambahkan beberapa entri sekaligus.
PATH=$PATH:~/opt/bin:~/opt/node/bin
atau variasi pada pekerjaan pemesanan baik-baik saja. Jangan letakkanexport
di awal baris karena memiliki komplikasi tambahan (lihat di bawah "Catatan tentang cangkang selain bash").Jika Anda
PATH
dibuat oleh banyak komponen berbeda, Anda mungkin berakhir dengan entri duplikat. Lihat Bagaimana cara menambahkan direktori home path untuk ditemukan oleh Unix perintah mana? dan Hapus entri $ PATH duplikat dengan perintah awk untuk menghindari menambahkan duplikat atau menghapusnya.Beberapa distribusi secara otomatis dimasukkan ke
~/bin
dalam PATH Anda jika ada.Di mana harus meletakkannya
Menempatkan baris untuk memodifikasi
PATH
di~/.profile
, atau~/.bash_profile
jika itu yang Anda miliki.Catatan yang
~/.bash_rc
tidak dibaca oleh program apa pun, dan~/.bashrc
merupakan file konfigurasi instance interaktif bash. Anda seharusnya tidak mendefinisikan variabel lingkungan di~/.bashrc
. Tempat yang tepat untuk mendefinisikan variabel lingkungan sepertiPATH
adalah~/.profile
(atau~/.bash_profile
jika Anda tidak peduli dengan shell selain bash). Lihat Apa perbedaan antara mereka dan yang mana yang harus saya gunakan?Jangan letakkan di
/etc/environment
atau~/.pam_environment
: ini bukan file shell, Anda tidak dapat menggunakan substitusi seperti$PATH
di sana. Dalam file-file ini, Anda hanya bisa menimpa variabel, bukan menambahkannya.Potensi komplikasi dalam beberapa skrip sistem
Anda tidak perlu
export
jika variabel sudah ada di lingkungan: setiap perubahan nilai variabel tercermin di lingkungan.PATH
Pretty hampir selalu ada di lingkungan; semua sistem unix mengaturnya sangat awal (biasanya pada proses pertama, sebenarnya).Pada saat login, Anda dapat mengandalkan
PATH
yang sudah ada di lingkungan, dan sudah mengandung beberapa direktori sistem. Jika Anda menulis skrip yang dapat dijalankan lebih awal saat menyiapkan beberapa jenis lingkungan virtual, Anda mungkin perlu memastikan bahwaPATH
itu tidak kosong dan diekspor: jikaPATH
masih tidak disetel, maka sesuatu sepertiPATH=$PATH:/some/directory
akan diaturPATH
ke:/some/directory
, dan komponen kosong di awal berarti direktori saat ini (seperti.:/some/directory
).Catatan tentang kerang selain bash
Di bash, ksh dan zsh,
export
adalah sintaks khusus, dan keduaPATH=~/opt/bin:$PATH
danexport PATH=~/opt/bin:$PATH
melakukan hal yang benar bahkan. Dalam shell Bourne / POSIX-style lainnya seperti dash (yang ada/bin/sh
di banyak sistem),export
diurai sebagai perintah biasa, yang menyiratkan dua perbedaan:~
hanya diurai pada awal kata, kecuali dalam penugasan (lihat Bagaimana menambahkan jalur direktori home yang ditemukan oleh Unix perintah? untuk rincian);$PATH
luar tanda kutip ganda istirahat jikaPATH
mengandung spasi atau\[*?
.Jadi di shell seperti dash,
setexport PATH=~/opt/bin:$PATH
PATH
ke string literal~/opt/bin/:
diikuti oleh nilaiPATH
hingga ruang pertama.PATH=~/opt/bin:$PATH
(tugas kosong) tidak memerlukan penawaran dan melakukan hal yang benar. Jika Anda ingin menggunakanexport
skrip portabel, Anda harus menulisexport PATH="$HOME/opt/bin:$PATH"
, atauPATH=~/opt/bin:$PATH; export PATH
(atauPATH=$HOME/opt/bin:$PATH; export PATH
agar mudah dibawa ke shell Bourne yang tidak menerimaexport var=value
dan tidak melakukan ekspansi tilde).¹ Ini tidak benar pada cangkang Bourne (seperti pada cangkang Bourne yang sebenarnya, bukan cangkang bergaya POSIX modern), tetapi Anda sangat tidak mungkin menemukan cangkang-cangkang tua seperti itu belakangan ini.
sumber
export
..bashrc
. Saya berasumsi karena FZF ditulis dalam Rust juga mengikuti pola Rust.Either way bekerja, tetapi mereka tidak melakukan hal yang sama: elemen
PATH
diperiksa dari kiri ke kanan. Dalam contoh pertama Anda, executable di~/opt/bin
akan lebih diutamakan daripada yang diinstal, misalnya, di/usr/bin
, yang mungkin atau mungkin tidak seperti yang Anda inginkan.Secara khusus, dari sudut pandang keamanan, berbahaya untuk menambahkan jalur ke depan, karena jika seseorang dapat memperoleh akses tulis ke Anda
~/opt/bin
, mereka dapat menempatkan, misalnya, perbedaanls
di sana, yang mungkin akan Anda gunakan sebagai gantinya dari/bin/ls
tanpa memperhatikan. Sekarang bayangkan hal yang sama untukssh
atau browser atau pilihan Anda ... (Hal yang sama berlaku untuk menempatkan. Di jalur Anda.)sumber
ls
, Anda harus meletakkannya di direktori sebelumnya/bin
.Saya bingung dengan pertanyaan 2 (sejak dihapus dari pertanyaan karena masalah yang tidak terkait):
Jika Anda mengatakan
itu saja yang ada di PATH Anda. PATH hanyalah variabel lingkungan, dan jika Anda ingin menambahkan ke PATH, Anda harus membangun kembali variabel dengan konten yang Anda inginkan. Artinya, apa yang Anda berikan sebagai contoh untuk pertanyaan 2 adalah persis apa yang ingin Anda lakukan, kecuali saya benar-benar kehilangan inti pertanyaan.
Saya menggunakan kedua formulir dalam kode saya. Saya memiliki profil umum yang saya instal pada setiap mesin yang saya kerjakan yang terlihat seperti ini, untuk mengakomodasi direktori yang berpotensi hilang:
sumber
Cara tahan peluru dari Appending / Prepending
Ada banyak pertimbangan yang terlibat dalam pilihan penambahan versus prepending. Banyak dari mereka tercakup dalam jawaban lain, jadi saya tidak akan mengulanginya di sini.
Poin penting adalah bahwa, bahkan jika skrip sistem tidak menggunakan ini (saya bertanya-tanya mengapa) * 1 , cara anti peluru untuk menambahkan path (misalnya,
$HOME/bin
) ke variabel lingkungan PATH adalahuntuk menambahkan (bukan
PATH="$PATH:$HOME/bin"
) danuntuk prepending (bukan
PATH="$HOME/bin:$PATH"
)Hal ini menghindari kolon leading / trailing palsu ketika
$PATH
awalnya kosong, yang dapat memiliki efek samping yang tidak diinginkan dan dapat menjadi mimpi buruk , sulit ditemukan ( jawaban ini secara singkat berkaitan dengan caseawk
- the - the way).Penjelasan (dari Ekspansi Parameter Shell ):
Dengan demikian,
${PATH:+${PATH}:}
diperluas ke: 1) tidak ada, jikaPATH
nol atau tidak disetel, 2)${PATH}:
, jikaPATH
diatur.Catatan : Ini untuk bash.
* 1 Saya baru saja menemukan bahwa skrip seperti
devtoolset-6/enable
benar - benar menggunakan ini,sumber
Linux menentukan jalur pencarian yang dapat dieksekusi dengan
$PATH
variabel lingkungan. Untuk menambahkan direktori / data / myscripts ke awal$PATH
variabel lingkungan, gunakan yang berikut ini:Untuk menambahkan direktori itu ke ujung jalan, gunakan perintah berikut:
Tetapi sebelumnya tidak cukup karena ketika Anda menetapkan variabel lingkungan di dalam skrip, perubahan itu hanya efektif dalam skrip. Hanya ada dua cara untuk mengatasi batasan ini:
Contoh:
Inklusi pada dasarnya menggabungkan skrip "dipanggil" dalam skrip "panggil". Ini seperti #include dalam C. Jadi itu efektif di dalam skrip atau program "calling". Tetapi tentu saja, itu tidak efektif dalam program atau skrip apa pun yang dipanggil oleh program panggilan. Untuk membuatnya efektif sepanjang rantai panggilan, Anda harus mengikuti pengaturan variabel lingkungan dengan perintah ekspor.
Sebagai contoh, program bash shell menggabungkan konten file .bash_profile dengan penyertaan. Tempatkan 2 baris berikut di .bash_profile:
secara efektif menempatkan 2 baris kode tersebut dalam program bash. Jadi dalam bash, variabel $ PATH termasuk
$HOME/myscript.sh
, dan karena pernyataan ekspor, setiap program yang dipanggil oleh bash memiliki$PATH
variabel yang diubah . Dan karena setiap program yang Anda jalankan dari bash prompt dipanggil oleh bash, jalur baru ini berlaku untuk apa pun yang Anda jalankan dari bash prompt.Intinya adalah bahwa untuk menambahkan direktori baru ke path, Anda harus menambahkan atau menambahkan direktori ke variabel lingkungan $ PATH dalam skrip yang termasuk dalam shell, dan Anda harus mengekspor
$PATH
variabel lingkungan.Informasi lebih lanjut di sini
sumber
Untuk beberapa waktu sekarang saya telah menyimpan dua fungsi
pathadd
danpathrm
yang membantu dalam menambahkan elemen ke jalan tanpa perlu khawatir tentang duplikasi.pathadd
mengambil argumen jalur tunggal dan argumen opsionalafter
yang jika disediakan akan ditambahkan ke yangPATH
sebaliknya.Di hampir setiap situasi jika Anda menambahkan ke jalur maka Anda cenderung ingin menimpa apa pun yang sudah ada di jalur, itulah sebabnya saya memilih untuk menambahkan sebelumnya secara default.
Letakkan ini di skrip yang ingin Anda ubah lingkungan PATH dan sekarang bisa Anda lakukan.
Anda dijamin tidak menambahkan ke jalur jika sudah ada. Jika sekarang Anda ingin memastikan
/baz/bat
sudah di awal.Sekarang setiap jalur dapat dipindahkan ke depan jika sudah ada di jalur tanpa menggandakan.
sumber
Saya tidak dapat berbicara untuk distribusi lain, tetapi Ubuntu memiliki file, / etc / environment, yang merupakan jalur pencarian default untuk semua pengguna. Karena komputer saya hanya digunakan oleh saya, saya meletakkan direktori yang saya inginkan di jalur saya di sana, kecuali itu adalah tambahan sementara yang saya masukkan ke dalam skrip.
sumber
Ada beberapa situasi di mana penggunaannya
PATH=/a/b:$PATH
mungkin dianggap sebagai cara "salah" untuk menambahkan jalur kePATH
:PATH
bentuk yang sama.PATH
dalam bentuk yang berbeda (yaitu alias karena menggunakan symlinks atau..
).PATH
ketika itu dimaksudkan untuk menimpa entri lain diPATH
.Fungsi (khusus Bash) ini melakukan "hal yang benar" dalam situasi di atas (dengan pengecualian, lihat di bawah), mengembalikan kode kesalahan, dan mencetak pesan yang bagus untuk manusia. Kode dan pesan kesalahan dapat dinonaktifkan ketika tidak diinginkan.
Pengecualiannya adalah bahwa fungsi ini tidak mengkanonik lintasan yang ditambahkan
PATH
melalui cara lain, jadi jika alias non-kanonik untuk lintasan adaPATH
, ini akan menambah duplikat. Mencoba untuk meng-kanonikkan path yang sudah adaPATH
adalah proposisi yang tidak pasti karena path relatif memiliki makna yang jelas ketika diteruskan keprepath
tetapi ketika sudah di path Anda tidak tahu apa direktori kerja saat ini ketika ditambahkan.sumber
$PATH
seperti sebelumnya. Adapun-r
, tidak, saya pikir jalur relatif di$PATH
terlalu tidak dapat diandalkan dan aneh (jalur Anda berubah setiap kali Andacd
!) Ingin mendukung sesuatu seperti itu di alat umum.Bagi saya (di Mac OS X 10.9.5), menambahkan nama jalur (mis.
/mypathname
) Ke file/etc/paths
bekerja dengan sangat baik.Sebelum mengedit,
echo $PATH
mengembalikan:Setelah mengedit
/etc/paths
dan memulai kembali shell, variabel $ PATH ditambahkan/pathname
. Memang,echo $PATH
pengembalian:Apa yang terjadi adalah yang
/mypathname
telah ditambahkan ke$PATH
variabel.sumber
Untuk menambahkan jalur baru ke
PATH
variabel lingkungan:Untuk perubahan ini harus diterapkan pada setiap shell Anda membuka, tambahkan ke file yang shell akan sumber ketika dipanggil. Dalam cangkang yang berbeda ini dapat:
misalnya
Anda dapat melihat jalur yang disediakan di output di atas.
sumber
Ini solusinya:
Satu liner mudah dan menyenangkan yang tidak meninggalkan jejak
:
sumber