Apakah tmux “mengurutkan” variabel PATH?

14

Saya memiliki masalah yang dapat direproduksi:

  1. siapkan PATH saya di Bash .profile
  2. mulai tmux oleh tmux, tmux attachatau varian apa pun
  3. echo $ PATH dan melihatnya dengan komponen yang sama tetapi dalam urutan berbeda

Bagaimana cara menghentikannya? Apa yang menjelaskannya?

Robottinosino
sumber

Jawaban:

29

Jika Anda menggunakan Mac dan bertanya-tanya mengapa /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/binterus ditambahkan ke PATH ketika Anda menjalankan tmux, itu karena sebuah utilitas bernama path_helper yang dijalankan dari /etc/profilefile Anda .

Anda tidak dapat dengan mudah membujuk tmux (atau lebih tepatnya, bash) untuk tidak sumber /etc/profile(untuk beberapa alasan tmux selalu berjalan sebagai shell login, yang berarti / etc / profile akan dibaca), tetapi Anda dapat memastikan bahwa efek dari path_helper don bisa mengacaukan dengan PATH Anda.

Caranya adalah memastikan PATH kosong sebelum path_helper berjalan. Dalam ~/.bash_profilefile saya, saya punya ini:

if [ -f /etc/profile ]; then
    PATH=""
    source /etc/profile
fi

Mengosongkan PATH sebelum path_helper dijalankan akan mencegahnya dari prapeletakan PATH default ke PATH yang Anda pilih sebelumnya, dan akan memungkinkan sisa skrip pengaturan bash pribadi Anda (perintah lebih jauh ke bawah .bash_profile, atau .bashrcjika Anda berasal dari .bash_profile) untuk mengatur Anda PATH sesuai.

Harapan itu masuk akal ...

Graham Ashton
sumber
1
Ini benar-benar melakukannya untuk saya! Saya menyembunyikannya di balik if [ -n "$TMUX" ]klausa sendiri, tetapi saya bertanya-tanya - seberapa pentingkah [ -f /etc/profile ]sebenarnya? Bukankah aman untuk menganggap bahwa /etc/profileitu selalu file biasa?
Ryan Lue
1
@RyanLue Anda dapat menggantinya -fdengan nyaman -e, tetapi saya tidak akan secara pribadi mencoba dan mengambil file dari skrip yang dijalankan ketika saya login kecuali saya telah memeriksanya. Saya cenderung menggunakan kembali skrip bash saya pada banyak mesin yang berbeda (dan sistem operasi), jadi saya ingin memastikan mereka buktinya. Saya bisa membayangkan beberapa varian unix lain mungkin menyebutnya sesuatu yang lain.
Graham Ashton
TERIMA KASIH! Ini membuatku gila, dan menempatkan potongan kecil itu di puncak ~/.bash_profilekewarasananku membawa kembali ke dunia tmux-ku yang bahagia.
hoosierEE
Jika Anda tidak ingin main-main dengan default sistem, set -g default-command "${SHELL}"di .tmux.confpasukan tmux menggunakan kerang non-login. Saya tidak mengerti maksudnya, karena Anda biasanya membuka tmux setelah Anda masuk.
seeker_of_bacon
5

Tidak; pengurutan $PATHakan menjadi hal yang terlalu gila untuk dilakukan, karena banyak sistem bergantung pada urutan penggunanya.

Namun, tmux tidak memulai shell Anda dalam mode "login", menyebabkan ~/.profilebersumber lagi . Ini berarti bahwa jika Anda memiliki sesuatu seperti PATH=/my/dir:/another/dir:$PATHdalam file itu , itu akan dilakukan lagi , menghasilkan $ PATH yang mengandung /my/dir:/another/dir:/my/dir:/another/dir:(etc.). Untuk menghindari ini, Anda bisa menggunakan variabel lain untuk memeriksa:

if [ "$_SKIP_PROFILE" ]; then
    return 0
else
    export _SKIP_PROFILE=y
fi

export PATH="/my/dir:/another/dir:$PATH"
pengguna1686
sumber
0

@ Grey Ashton Terima kasih atas ide Anda

Saran saya adalah agar Anda menempatkan

if [ -f /etc/profile ]; then
    PATH=""
    source /etc/profile
fi

di file .zshrc Anda di atasnya.

PASTIKAN itu milik Anda

export NVM_DIR="$HOME/.nvm"
. "/usr/local/opt/nvm/nvm.sh"

di bawah.

sunsoft
sumber