I'm bertanya-tanya di mana jalan baru harus ditambahkan ke JALAN
variabel lingkungan. Aku tahu hal ini dapat dicapai dengan editing .bashrc
(misalnya), tapi itu's tidak jelas bagaimana untuk melakukan hal ini.
Dengan cara ini:
export PATH=~/opt/bin:$PATH
atau ini?
export PATH=$PATH:~/opt/bin
PATH=$PATH:~/opt/bin
atau
PATH=~/opt/bin:$PATH
tergantung pada apakah anda ingin menambahkan ~/opt/bin
pada akhir (yang akan dicari setelah semua direktori lain, dalam kasus ini ada program dengan nama yang sama di beberapa direktori) atau pada awal (yang akan dicari sebelum semua direktori lain).
Anda dapat menambahkan beberapa entri pada waktu yang sama. PATH=$PATH:~/opt/bin:~/opt/node/bin
atau variasi pada urutan pekerjaan yang baik-baik saja. Don't menempatkan ekspor
di awal baris saat ini memiliki komplikasi tambahan (lihat di bawah "Catatan pada kerang lainnya dari bash").
Jika anda PATH
akan dibangun oleh berbagai komponen yang berbeda, anda mungkin berakhir dengan entri duplikat. Lihat https://unix.stackexchange.com/questions/25605/how-to-add-home-directory-path-to-be-discovered-by-unix-which-command dan https://unix.stackexchange.com/questions/40749/remove-duplicate-path-entries-with-awk-command untuk menghindari menambahkan duplikat atau menghapus mereka.
Beberapa distribusi secara otomatis menempatkan ~/bin
di JALAN anda jika ada, dengan cara.
Menempatkan garis untuk mengubah JALAN
di ~/.profil
, atau ~/.bash_profile
jika's apa yang anda miliki.
Perhatikan bahwa ~/.bash_rc
tidak dibaca oleh program apapun, dan ~/.bashrc
adalah file konfigurasi interaktif contoh bash. Anda tidak harus mendefinisikan variabel lingkungan dalam ~/.bashrc
. Tempat yang tepat untuk mendefinisikan variabel lingkungan seperti PATH``~/.profil
(atau ~/.bash_profile
jika anda don't peduli tentang kerang lainnya dari bash). Melihat Apa yang's perbedaan antara mereka dan yang mana yang harus saya use?
Don't meletakkannya di /etc/environment
atau ~/.pam_environment
: ini bukan shell file, anda dapat't menggunakan substitusi seperti $PATH
di sana. Dalam file ini, anda hanya bisa mengganti variabel, tidak menambahkan untuk itu.
Anda don't perlu ekspor
jika variabel sudah di lingkungan: perubahan nilai dari variabel yang tercermin dalam lingkungan.¹ PATH
adalah hampir selalu ada di lingkungan; semua sistem unix set ini sangat awal (biasanya dalam proses, pada kenyataannya).
Pada saat login, anda dapat bergantung pada JALAN
yang sudah ada di lingkungan, dan sudah mengandung beberapa direktori sistem. Jika anda're menulis sebuah script yang dapat dieksekusi awal saat menyiapkan beberapa jenis lingkungan virtual, anda mungkin perlu untuk memastikan bahwa PATH
non-kosong dan diekspor: jika PATH
masih diset, maka sesuatu seperti PATH=$PATH:/beberapa/direktori
akan membuat JALAN
untuk :/beberapa/direktori
, dan komponen kosong di awal berarti direktori saat ini (seperti .:/beberapa/direktori
).
if [ -z "${PATH-}" ]; then export PATH=/usr/local/bin:/usr/bin:/bin; fi
Di bash, ksh dan zsh, ekspor
adalah sintaks khusus, dan kedua PATH=~/opt/bin:$PATH
dan export PATH=~/opt/bin:$PATH
melakukan hal yang benar bahkan. Di lain Bourne/POSIX-gaya kerang seperti dash (yaitu /bin/sh
pada banyak sistem), ekspor
diurai biasa sebagai perintah, yang berarti dua perbedaan:
~
hanya diurai di awal kata, kecuali dalam tugas (lihat https://unix.stackexchange.com/questions/25605/how-to-add-home-directory-path-to-be-discovered-by-unix-which-command/25704#25704 untuk rincian);$PATH
di luar tanda kutip ganda [istirahat jika PATH
berisi spasi atau\[*?
](https://unix.stackexchange.com/questions/131766/why-does-my-shell-script-choke-on-whitespace-or-other-special-characters).Jadi dalam kerang seperti dash, <menyerang>export PATH=~/opt/bin:$PATH
</strike> set PATH
untuk literal string ~/opt/bin/:
diikuti oleh nilai JALAN
ke luar angkasa pertama.
PATH=~/opt/bin:$PATH
(telanjang penugasan) doesn't membutuhkan kutipan dan melakukan hal yang benar. Jika anda ingin menggunakan ekspor
di sebuah portable script, anda perlu untuk menulis export PATH="$HOME/opt/bin:$PATH"
, atau PATH=~/opt/bin:$PATH export PATH
(atau PATH=$HOME/opt/bin:$PATH export PATH
untuk portabilitas bahkan Bourne shell yang tidak't menerima ekspor var=value
dan tidak't melakukan tilde ekspansi).
¹ Ini bukan't sejati di Bourne (seperti dalam sebenarnya Bourne shell, tidak modern POSIX-gaya kerang), tetapi anda're sangat tidak mungkin untuk menemukan tua seperti kerang hari ini.
Cara baik bekerja, tetapi mereka don't melakukan hal yang sama: unsur-unsur PATH'are diperiksa kiri ke kanan. Dalam contoh pertama, executable di
~/opt/binakan didahulukan dari orang-orang yang diinstal, misalnya, di
/usr/bin`, yang mungkin atau mungkin tidak menjadi apa yang anda inginkan.
Khususnya, dari aspek keselamatan, itu berbahaya untuk menambahkan path ke depan, karena jika seseorang bisa mendapatkan akses menulis ke ~/opt/bin
, mereka dapat menempatkan, misalnya, berbeda ls
di sana, yang anda'd maka mungkin menggunakan bukan /bin/ls
tanpa memperhatikan. Sekarang bayangkan hal yang sama untuk ssh
atau browser anda atau pilihan... (hal Yang sama berlaku triply untuk menempatkan . di jalan anda.)
I'm bingung dengan pertanyaan 2 (karena dihapus dari pertanyaan sejak itu karena terkait masalah):
Yang's yang bisa diterapkan cara untuk menambahkan lebih banyak jalan di jalur yang berbeda? pada Awalnya saya pikir ini bisa melakukan trik:
export PATH=$PATH:~/opt/bin export PATH=$PATH:~/opt/node/bin
tapi itu doesn't karena kedua tugas doesn't hanya menambahkan
~/opt/node/bin
, tapi juga seluruhJALAN
yang ditetapkan sebelumnya.Ini adalah solusi yang mungkin:
export PATH=$PATH:~/opt/bin:~/opt/node/bin
tetapi untuk dibaca I'a lebih memilih untuk memiliki satu tugas untuk satu jalur.
Jika anda mengatakan
PATH=~/opt/bin
yang's semua yang akan berada di JALAN anda. JALAN adalah hanya variabel lingkungan, dan jika anda ingin menambahkan ke JALAN, anda harus membangun kembali variabel dengan tepat isi yang anda inginkan. Artinya, apa yang anda berikan sebagai contoh untuk pertanyaan 2 adalah persis apa yang ingin anda lakukan, kecuali saya'm benar-benar hilang titik dari pertanyaan.
Saya menggunakan kedua bentuk di kode saya. Saya telah generik profil yang saya instal di setiap mesin I bekerja pada yang terlihat seperti ini, untuk mengakomodasi berpotensi hilang direktori:
export PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11
# add optional items to the path
for bindir in $HOME/local/bin $HOME/bin; do
if [ -d $bindir ]; then
PATH=$PATH:${bindir}
fi
done
Peluru-bukti cara Menambahkan/Mengawali
Ada banyak pertimbangan yang terlibat dalam pilihan menambahkan versus mengawali. Banyak dari mereka yang tercakup dalam jawaban yang lain, jadi saya tidak akan mengulangi mereka di sini.
Titik penting adalah bahwa, bahkan jika sistem script tidak menggunakan ini (aku bertanya-tanya mengapa)*1,
peluru-bukti cara untuk menambah jalan (misalnya, $HOME/bin
) untuk variabel lingkungan PATH adalah
PATH="${PATH:+${PATH}:}$HOME/bin"
untuk menambahkan (bukan PATH="$PATH:$HOME/bin"
)
dan
PATH="$HOME/bin${PATH:+:${PATH}}"
untuk mengawali (bukan PATH="$HOME/bin:$PATH"
)
Hal ini untuk menghindari palsu terkemuka/trailing usus besar ketika $PATH
awalnya kosong, yang dapat memiliki efek samping yang tidak diinginkan dan dapat menjadi mimpi buruk, sulit untuk menemukan (jawaban ini secara singkat berkaitan dengan kasus awk
-way).
Penjelasan (dari Shell Parameter Perluasan):
${parameter:+word}
Jika
parameter
adalah null atau tidak diset, tidak ada yang diganti, jika tidak, perluasankata
diganti.
Dengan demikian, ${PATH:+${PATH}:}
diperluas ke:
PATH
adalah null atau tidak diset,${PATH}:
, jika PATH
diatur.**** Catatan: Ini adalah untuk bash.
$ cat /opt/rh/devtoolset-6/enable
# General environment variables
export PATH=/opt/rh/devtoolset-6/root/usr/bin${PATH:+:${PATH}}
...
Linux menentukan eksekusi pencarian jalur dengan $PATH
variabel lingkungan. Untuk menambahkan direktori /data/myscripts ke awal $PATH
variabel lingkungan, menggunakan berikut:
PATH=/data/myscripts:$PATH
Untuk menambahkan direktori tersebut ke ujung jalan, gunakan perintah berikut:
PATH=$PATH:/data/myscripts
Tapi sebelumnya tidak cukup karena ketika anda mengatur variabel lingkungan dalam naskah, yang berubah hanya efektif dalam script. Hanya ada dua cara di sekitar keterbatasan ini:
Contoh:
$HOME/myscript.sh
source $HOME/myscript.sh
Inklusi pada dasarnya menggabungkan "yang disebut" script "panggilan" script. It's seperti #include dalam C. Jadi's efektif dalam "panggilan" script atau program. Tapi tentu saja, itu's tidak efektif dalam setiap program atau script yang disebut dengan memanggil program. Untuk membuatnya efektif semua jalan ke bawah rantai panggilan, anda harus mengikuti pengaturan dari variabel lingkungan dengan ekspor perintah.
Sebagai contoh, bash shell program menggabungkan isi dari file .bash_profile dengan inklusi. Tempat 2 baris berikut di .bash_profile:
PATH=$PATH:/data/myscripts
export PATH
secara efektif menempatkan orang-2 baris kode di bash program. Jadi dalam bash, $PATH variabel termasuk $HOME/myscript.sh
, dan karena pernyataan ekspor, apapun program yang disebut oleh bash telah diubah $PATH
variabel. Dan karena setiap program yang anda jalankan dari bash prompt yang disebut oleh bash, jalur baru ini berlaku untuk apa pun yang anda menjalankan dari bash prompt.
Intinya adalah bahwa untuk menambahkan direktori baru ke jalan, anda harus menambahkan atau tambahkan direktori ke $PATH variabel lingkungan dalam script yang disertakan dalam shell, dan anda harus mengekspor $PATH
variabel lingkungan.
Informasi lebih lanjut disini
Untuk beberapa waktu sekarang, aku've disimpan dengan saya dua fungsi pathadd
dan pathrm
yang membantu dalam menambahkan elemen ke jalan tanpa perlu khawatir tentang duplikasi.
pathadd
mengambil satu argumen path dan opsional setelah
argumen yang jika diberikan akan menambah PATH
jika tidak menambahkan hal itu.
Di hampir setiap situasi jika anda're menambah jalan kemudian anda're cenderung ingin menolak apa-apa yang sudah di jalan, yang adalah mengapa saya memilih untuk menambahkan secara default.
pathadd() {
newelement=${1%/}
if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; then
if [ "$2" = "after" ] ; then
PATH="$PATH:$newelement"
else
PATH="$newelement:$PATH"
fi
fi
}
pathrm() {
PATH="$(echo $PATH | sed -e "s;\(^\|:\)${1%/}\(:\|\$\);\1\2;g" -e 's;^:\|:$;;g' -e 's;::;:;g')"
}
Menempatkan ini dalam setiap script anda ingin mengubah JALAN lingkungan dan dapat anda lakukan sekarang.
pathadd "/foo/bar"
pathadd "/baz/bat" after
export PATH
Anda're dijamin tidak menambah jalan jika itu's sudah ada. Jika anda ingin memastikan /baz/bat
di awal.
pathrm "/baz/bat"
pathadd "/baz/bat"
export PATH
Sekarang setiap jalan dapat dipindahkan ke depan jika itu's sudah di jalan tanpa dua kali lipat.
Saya dapat't berbicara untuk distro lain, tetapi Ubuntu memiliki file /etc/environment, yaitu lintasan pencarian default untuk semua pengguna. Karena komputer hanya digunakan oleh saya, saya menempatkan setiap direktori yang ingin saya di jalan saya di sana, kecuali sementara itu yang saya dimasukkan ke dalam script.
Ada beberapa situasi di mana ia menggunakan PATH=/a/b:$PATH
mungkin dianggap "salah" cara untuk menambahkan path ke JALAN
:
JALAN
dalam bentuk yang sama.JALAN
dalam bentuk yang berbeda (yaitu, alias karena menggunakan symlink atau ..
).PATH
ketika itu's dimaksudkan untuk mengganti entri lain di JALAN
.Ini (Bash-satunya) fungsi tidak "benar" dalam situasi di atas (dengan pengecualian, lihat di bawah), kembali kode kesalahan, dan mencetak pesan bagus untuk manusia. Kode kesalahan dan pesan dapat dinonaktifkan ketika mereka're tidak diinginkan.
prepath() {
local usage="\
Usage: prepath [-f] [-n] [-q] DIR
-f Force dir to front of path even if already in path
-n Nonexistent dirs do not return error status
-q Quiet mode"
local tofront=false errcode=1 qecho=echo
while true; do case "$1" in
-f) tofront=true; shift;;
-n) errcode=0; shift;;
-q) qecho=':'; shift;;
*) break;;
esac; done
# Bad params always produce message and error code
[[ -z $1 ]] && { echo 1>&2 "$usage"; return 1; }
[[ -d $1 ]] || { $qecho 1>&2 "$1 is not a directory."; return $errcode; }
dir="$(command cd "$1"; pwd -P)"
if [[ :$PATH: =~ :$dir: ]]; then
$tofront || { $qecho 1>&2 "$dir already in path."; return 0; }
PATH="${PATH#$dir:}" # remove if at start
PATH="${PATH%:$dir}" # remove if at end
PATH="${PATH//:$dir:/:}" # remove if in middle
fi
PATH="$dir:$PATH"
}
Pengecualian adalah bahwa fungsi ini tidak canonicalize jalur ditambahkan ke JALAN
melalui cara lain, sehingga jika seorang non-kanonik alias untuk jalan di JALAN
, ini akan menambah duplikat. Mencoba untuk canonicalize jalan yang sudah di PATH
pasti proposisi sejak path relatif memiliki makna yang jelas ketika lulus untuk prepath
tapi ketika sudah di jalan yang anda don't tahu apa yang direktori kerja saat ini adalah ketika itu menambahkan.
Bagi saya (pada Mac OS X 10.9.5), menambahkan nama jalan (misalnya /mypathname
) ke dalam file /etc/jalur
bekerja dengan sangat baik.
Sebelum mengedit, echo $PATH
kembali:
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
Setelah editing /etc/jalan
dan restart shell, $PATH variabel ditambahkan dengan /path
. Memang, echo $PATH
kembali:
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/mypathname
Apa yang terjadi adalah bahwa /mypathname
telah ditambahkan ke $PATH
variabel.
Untuk menambahkan sebuah jalan baru untuk PATH
variabel lingkungan:
export PATH=$PATH:/new-path/
Untuk perubahan ini dapat diterapkan untuk setiap shell anda terbuka, tambahkan ke file shell akan sumber ketika dipanggil. Dalam berbagai kerang ini dapat:
misalnya
# export PATH=$PATH:/root/learning/bin/
# source ~/.bashrc
# echo $PATH
Anda dapat melihat disediakan jalan di output di atas.