Setelah memulai terminal bash, saya perhatikan bahwa variabel PATH berisi entri duplikat. Terminal saya memulai shell login , jadi ~/.bash_profile
bersumber, diikuti oleh ~/.profile
dan ~/.bashrc
. Hanya di ~/.profile
saya membuat entri jalur yang digandakan.
Untuk menjadi bertele-tele, ini adalah urutan di mana file-file yang HARUS dipasok bersumber:
Sourced /etc/profile
Sourced /etc/bash.bashrc
Sourced .bash_profile
Sourced .profile
Sourced .bashrc
Sebelum ada yang menandai ini sebagai duplikat dari "variabel PATH berisi duplikat", terus membaca.
Pada awalnya saya pikir ini ada hubungannya dengan ~/.profile
bersumber dua kali, jadi saya meminta file untuk menulis ke file log setiap kali itu bersumber, dan anehnya itu hanya masuk satu entri, yang memberitahu saya bahwa itu hanya bersumber satu kali. Yang lebih mengejutkan adalah fakta bahwa ketika saya mengomentari entri yang ada ~/.profile
, entri tersebut masih muncul dalam PATH
variabel. Ini membawa saya ke tiga kesimpulan, salah satunya dengan cepat dikesampingkan:
- Bash mengabaikan komentar bash yang valid dan masih mengeksekusi kode yang berkomentar
- Ada skrip yang membaca
~/.profile
dan mengabaikan kode apa pun yang mencetak output (file log misalnya) - Ada salinan saya
~/.profile
yang bersumber di tempat lain
Yang pertama, saya dengan cepat menyimpulkan tidak menjadi masalah karena beberapa pengujian cepat. Opsi kedua dan ketiga adalah tempat saya membutuhkan bantuan.
Bagaimana cara mengumpulkan log skrip yang dijalankan ketika terminal saya mulai? Saya menggunakan echo
dalam file yang saya periksa untuk mengetahui apakah mereka bersumber oleh bash, tapi saya perlu menemukan metode konklusif yang melacak pelaksanaan sampai pada titik ketika terminal siap bagi saya untuk mulai mengetik ke dalamnya.
Jika hal di atas tidak memungkinkan, maka dapatkah ada yang menyarankan di mana lagi saya dapat melihat untuk melihat skrip yang sedang dijalankan .
Referensi masa depan
Ini skrip yang sekarang saya gunakan untuk menambahkan ke jalur saya:
function add_to_path() {
for path in ${2//:/ }; do
if ! [[ "${!1}" =~ "${path%/}" ]]; then # ignore last /
new_path="$path:${!1#:}"
export "$1"="${new_path%:}" # remove trailing :
fi
done
}
Saya menggunakannya seperti ini:
add_to_path 'PATH' "/some/path/bin"
Script memeriksa apakah path sudah ada dalam variabel sebelum memprioritaskannya.
Untuk pengguna zsh, Anda dapat menggunakan yang setara ini:
function add_to_path() {
for p in ${(s.:.)2}; do
if [[ ! "${(P)1}" =~ "${p%/}" ]]; then
new_path="$p:${(P)1#:}"
export "$1"="${new_path%:}"
fi
done
}
Edit 28/8/2018
Satu hal lagi yang saya temukan bisa saya lakukan dengan skrip ini adalah juga memperbaiki jalurnya. Jadi pada awal .bashrc
file saya , saya melakukan sesuatu seperti ini:
_temp_path="$PATH"
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'
add_to_path 'PATH' "$_temp_path"
unset _temp_path
Terserah Anda apa yang PATH
harus dimulai. Periksa PATH
dulu untuk memutuskan.
~/.profile
jika~/.bash_profile
tidak ada ...~/.profile
dan~/.bashrc
dari~/.bash_profile
Jawaban:
Jika sistem Anda memiliki
strace
maka Anda dapat membuat daftar file yang dibuka oleh shell, misalnya menggunakan(
-li
berarti shell login interaktif; gunakan hanya-i
untuk shell non-login interaktif.)Ini akan menampilkan daftar file yang dibuka atau coba dibuka oleh shell. Di sistem saya, mereka adalah sebagai berikut:
/etc/profile
/etc/profile.d/*
(berbagai skrip dalam/etc/profile.d/
)/home/<username>/.bash_profile
(ini gagal, saya tidak punya file seperti itu)/home/<username>/.bash_login
(ini gagal, saya tidak punya file seperti itu)/home/<username>/.profile
/home/<username>/.bashrc
/home/<username>/.bash_history
(sejarah baris perintah; ini bukan skrip)/usr/share/bash-completion/bash_completion
/etc/bash_completion.d/*
(berbagai skrip yang menyediakan fungsionalitas pelengkapan otomatis)/etc/inputrc
(mendefinisikan ikatan utama; ini bukan skrip)Gunakan
man strace
untuk informasi lebih lanjut.sumber
echo $0
di terminal memberi-bash
daripada yang diharapkanbash
. Apakah Anda punya saran lain untuk ini?$0
adalah tanda hubung-
, atau ketika dipanggil dengan opsi-l
.echo PATH=\""$PATH"\"
di awal dan akhir.profile
dan.bashrc
? Dan kenapa tidak Anda melakukan apa yang orang lakukan dan mengatur PATH baik sepenuhnya, atau, jika menambahkan direktori, dijaga:echo ":$PATH:" | grep -q ":/path/to/dir:" || export PATH="$PATH:/path/to/dir"
?sudo bash -c "echo exit|dtruss bash -li|& less|grep '^open'"
di macOS. (ganti sajastrace
dengandtruss
)