Layar GNU tidak akan mewarisi PATH saya pada 10.5.8

11

Saya menggunakan layar setiap hari untuk kebutuhan terminal saya dan saya cukup senang dengannya. Baru-baru ini, meskipun, saya membuat beberapa update ke file konfigurasi pesta saya dan saya menyadari bahwa saya sedang menyiapkan berbagai PATHelemen ( PATH, MANPATH, INFOPATH, dll) di 2 tempat. Saya memodifikasi file menjadi apa yang seharusnya dan sekarang semua variabel lingkungan saya diatur sekali .bash_profile. Di sinilah letak masalah saya.

Rupanya, alasan saya mengaturnya di dua tempat adalah karena layar. layar tampaknya hanya mengeksekusi .bashrcdan tampaknya tidak mewarisi PATHvariabel lingkungan saya atau lainnya dengan benar dari shell bash asli saya. Karena hanya mengeksekusi .bashrcdan saya sekarang mengatur variabel saya .bash_profilesaja, saya mendapatkan tidak lengkap PATH.

Pertanyaan saya adalah bagaimana cara memasukkan variabel lingkungan saya ke layar tanpa duplikasi. Membaca Bashdokumen tampaknya menunjukkan bahwa itu bisa menjadi jenis shell yang digunakan layar untuk masuk, yaitu shell interaktif non-login tapi saya tidak tahu cara memaksa layar untuk menggunakan jenis shell tertentu, hanya saja shell untuk digunakan via -s /bin/bash.

Anda dapat membaca dengan teliti file konfigurasi saya di halaman GitHub saya . Ini adalah komit yang merusak layar .

EDIT: Saya menggunakan Screen version 4.00.03 (FAU) 23-Oct-06dan saya cenderung memintanyascreen -h 50000

EDIT: Saya sekarang bisa menguji ini di Cygwin ( CYGWIN_NT-5.1 1.7.1(0.218/5/3) i686, Screen version 4.00.03 (FAU) 23-Oct-06) dan menunjukkan perilaku yang berbeda dari pada Mac saya.

Perilaku spesifik yang sekarang saya temukan adalah bahwa dalam Cygwin perubahan yang saya buat PATHdi .bash_profile diduplikasi saat memasuki layar dan kemudian pembuatan jendela layar berturut-turut tidak menduplikasi jalur tetapi melakukan sumber ulang .bash_profile.

Untuk menggambarkan perilaku yang saya bicarakan:

Output dari terminal baru:

...

PATH: /home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/Program Files/ATI Technologies/ATI.ACE/Core-Static:/groovy-1.6.1/bin:/usr/lib/lapack

MANPATH: /home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man::/usr/ssl/man

Aliases:
alias ..='cd ..'
alias ...='cd ../..'

...

[~]$

Output dari permintaan pertama layar:

[~]$ screen -h 50000 -s -/bin/bash

...

PATH: /home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/Program Files/ATI Technologies/ATI.ACE/Core-Static:/groovy-1.6.1/bin:/usr/lib/lapack

MANPATH: /home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man:/home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man::/usr/ssl/man:/usr/ssl/man

Aliases:
alias ..='cd ..'
alias ...='cd ../..'

...

[~]$

Panggilan selanjutnya ke C-a c:

...

PATH: /home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/home/tvishe01/bin/emacs/bin:/home/tvishe01/bin:/usr/local/bin:/usr/bin:/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/Program Files/ATI Technologies/ATI.ACE/Core-Static:/groovy-1.6.1/bin:/usr/lib/lapack

MANPATH: /home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man:/home/tvishe01/share/man:/usr/local/man:/usr/share/man:/usr/man::/usr/ssl/man:/usr/ssl/man

Aliases:
alias ..='cd ..'
alias ...='cd ../..'

...

[~]$

Anda bisa lihat

Tim Visher
sumber
Duplikasi ini karena Anda telah mengkonfigurasi bash untuk menambahkan entri ini tanpa syarat dengan itu adalah shell 'login', dan Anda memberi tahu layar untuk memanggil bash sebagai shell 'login'. Saya telah menulis ulang jawaban saya untuk mencoba mengatasi masalah umum variabel kerang, layar , dan lingkungan.
Chris Johnsen

Jawaban:

16

layar dan Variabel Lingkungan

Secara default, layar meneruskan cangkang (dan proses lainnya) variabel lingkungan apa pun yang dimilikinya saat sesi dimulai (mis. Menghubungkan kembali tidak mengubah variabel lingkungan mana yang diberikan ke cangkang baru). Tetapi karena file konfigurasi layar dan shell umumnya mengubah variabel lingkungan, ada banyak tempat di mana perubahan yang tidak terduga dapat diperkenalkan. Ada beberapa variabel, seperti TERM , yang layarnya hampir selalu berubah, tetapi ini biasanya diperlukan untuk fungsi yang disediakan layar .

Katakanlah konfigurasi shell Anda, atau konfigurasi layar tidak akan mengubah variabel bernama FOOBAR (kemungkinan besar, semuanya). Jika Anda memulai sesi dengan FOOBAR=foo screen, maka semua shell yang dibuat dalam sesi itu akan memiliki variabel lingkungan bernama FOOBAR dengan nilai foo.

Hal-hal menjadi lebih rumit untuk variabel yang diubah oleh layar atau shell Anda.

Pengaturan Hilang Saat Menggunakan layar

Login Shells

Jika Anda menemukan bahwa beberapa pengaturan tidak ada dalam shell yang dimulai oleh layar , itu mungkin karena shell Anda hanya dikonfigurasikan untuk memperbarui pengaturan tersebut untuk shell 'login'. Sebagian besar shell memahami konvensi khusus (dalam C:) **argv == '-'bahwa layar dapat dikonfigurasi untuk digunakan.

Per dokumentasi layar :

perintah shell

Setel perintah yang akan digunakan untuk membuat shell baru. Ini menimpa nilai variabel lingkungan $ SHELL. Ini berguna jika Anda ingin menjalankan tty-enhancer yang diharapkan untuk mengeksekusi program yang ditentukan dalam $ SHELL. Jika perintah dimulai dengan karakter '-', shell akan dimulai sebagai shell login.

Untuk membuat shell start layar sebagai shell 'login', mulai layar dengan screen -s -/bin/bash, atau tambahkan baris ini ke .screenrc:

shell -/bin/bash

Sesuaikan jalur ke shell apa pun yang kebetulan Anda gunakan.

Konfigurasi layar

Variabel lingkungan yang hilang atau diatur ulang dapat juga disebabkan oleh setenvdan unsetenvperintah dalam file konfigurasi layar . Anda harus memeriksa .screenrc di direktori home Anda dan file mana pun yang digunakan kompilasi layar Anda sebagai 'system screenrc' (Anda dapat mencoba perintah seperti strings "$(which screen)" | fgrep -i screenrcmencari pathname yang telah dikonfigurasikan pada waktu kompilasi – biasanya / etc / screenrc untuk layar yang diinstal sistem ; instalasi tambahan mungkin akan menggunakan beberapa pathname lain). Anda dapat menggunakan SCREENRC=/dev/null SYSSCREENRC=/dev/null screenuntuk sementara waktu menghindari file pengaturan ini, tetapi ada opsi waktu kompilasi yang mencegah penggunaan SYSSCREENRC secara efektif (mungkin agar administrator sistem dapat memaksa sedikit konfigurasi awal).

Pengaturan Duplikat Saat Menggunakan layar

Sangat umum untuk menambahkan item ke variabel lingkungan seperti PATH dalam file konfigurasi shell sehingga nilai yang diperbarui tersedia untuk sesi shell normal (misalnya xterm atau jendela terminal lain, sesi konsol, dll.). Jika item tersebut ditambahkan dalam konfigurasi per-shell (atau, jika Anda menggunakan -/path/to/shellpengaturan yang dijelaskan di atas, dalam konfigurasi shell-per-login) maka shell yang dimulai oleh layar kemungkinan akan memiliki banyak salinan dari item yang ditambahkan.

Salah satu strategi untuk menghindari ini adalah dengan menempatkan semua tambahan ke variabel seperti PATH dalam konfigurasi per-login shell Anda dan menghindari menggunakan -/path/to/shellpengaturan shell dengan layar .

Strategi lain adalah dengan hanya menambahkan item-item baru secara kondisional ke variabel. Tergantung pada shell, kode untuk melakukan ini bisa sedikit rumit, tetapi biasanya dapat dienkapsulasi dalam fungsi shell agar mudah digunakan.

Namun strategi lain adalah selalu memulai dengan nilai tetap dalam file konfigurasi Anda. Ini kadang-kadang dapat menyebabkan masalah ketika memindahkan file konfigurasi Anda dari sistem ke sistem ketika nilai-nilai default mungkin sangat bervariasi.

Diagnostik

Jika Anda tidak dapat langsung melihat di mana modifikasi tertentu terjadi, Anda dapat mencoba yang berikut untuk melacak di mana perubahan itu terjadi.

Periksa nilai saat ini di shell awal Anda:

echo "$PATH"

Periksa bagaimana shell itu sendiri mengubah nilai ketika sub-shell dibuat:

/bin/bash -c 'echo "$PATH"'

Periksa bagaimana shell memodifikasi nilai ketika sub-shell 'login' dibuat:

perl -e '$s=shift;exec {$s} "-$s", @ARGV or die "unable to start shell"' /bin/bash
echo "$PATH"
exit

Periksa bagaimana layar mengubah nilai:

printf '#!/bin/sh\nl=/tmp/echo-var.log;rm -f "$l"; echo $PATH >"$l"' >/tmp/echo-var &&
chmod a+x /tmp/echo-var &&
screen -s /tmp/echo-var &&
cat /tmp/echo-var.log
Chris Johnsen
sumber
Ini memecahkan sebagian dari masalah saya. Sayangnya itu tidak berjalan sepenuhnya. Sekarang, layar berfungsi dengan baik screen -s -/bin/bashtetapi tidak berperilaku seperti yang saya harapkan untuk berperilaku di bawah Cygwin pada mesin kerja saya. Di mesin itu, saya menjalankan screen -h 50000dan itu hanya mewarisi saya PATHtanpa benar-benar sumber file lagi. Ini berjalan baik setiap kali saya meluncurkan jendela baru.
Tim Visher
Lingkungan proses layar harus selalu diwarisi oleh anak-anaknya (kecuali untuk hal-hal seperti JANGKA yang mungkin ditimpa). Coba FOOBAR=baz screendan periksa echo $FOOBARdi shell windows dari screendan screen -s -/bin/bash. Kedua variasi harus memiliki FOOBAR= baz. Jika Anda PATHsedang dimodifikasi, maka Anda harus melacak apa yang sedang dilakukan. Coba SYSSCREENRC=/dev/null SCREENRC=/dev/null screen, jika itu memungkinkan Anda PATHmelalui, maka mungkin setenv PATHdalam /etc/screenrcatau ~/.screenrc. Kalau tidak, itu adalah sesuatu yang Anda .bashrclakukan.
Chris Johnsen
Saya telah melakukan penulisan ulang besar / tambahan untuk jawaban saya.
Chris Johnsen
2

Terakhir kali saya melihat masalah serupa, saya menyelesaikannya dengan menggunakan screen -lsaat memulai layar.

Anda dapat menggunakan -lopsi saat memohon screen(aktifkan mode login ; juga dikendalikan oleh deflogindan loginperintah di .screenrc) untuk mengatur apakah layar harus masuk secara default (menambahkan / menghapus entri / etc / utmp).

Mode masuk diaktifkan secara default, tetapi itu dapat diubah pada waktu kompilasi. Jika layar tidak dikompilasi dengan dukungan utmp, perintah ini tidak tersedia.

Saya sepertinya tidak membutuhkan -lmode di layar default Debian Lenny (v4.0.3); tampaknya diaktifkan secara default. Saya ~/.profiledan ~/.bashrcsedang dibaca dengan benar. Bagaimana kabarmu screen? Versi apa yang Anda gunakan?

quack quixote
sumber
tho di bawah teori ini, tidakscreen -ln boleh menjalankan saya , dan itu masih bisa berjalan. jadi coba benderanya, tapi ini mungkin bukan jawaban yang tepat. akan meninggalkannya di sini untuk saat ini. ~/.profile-l
quack quixote
Tampaknya -lhanya mengontrol apakah screenmenambahkan entri ke utmpfile, bukan apakah itu memanggil shell baru dengan -lopsi mereka sendiri atau menggunakan -kustom exec- with- -prefix.
Chris Johnsen
2

Masalahnya terletak pada perilaku launchd di Leopard. Lihat laporan bug MacPorts ini untuk layar di Leopard untuk melihat mengapa itu tidak akan pernah diperbaiki kecuali Anda entah bagaimana dapat mendukungportd peluncuran Snow Leopard.

https://trac.macports.org/ticket/18235#comment:26

ClashTheBunny
sumber
1

Tidak ada yang salah dengan sumber .bashrc Anda dari dalam .bash_profile. Jika Anda hanya menggunakan mesin Anda secara lokal .bash_profile Anda dalam kebanyakan kasus hanya akan bersumber ketika Anda melakukan login awal Anda (jelas ada waktu lain yang bersumber).

Saya mengatur file saya sehingga jika saya ingin sesuatu dilakukan hanya ketika saya masuk, saya memasukkan informasi dalam .bash_profile dan untuk semua yang lain saya meletakkannya di .bashrc. PATH adalah satu hal yang saya letakkan di .bashrc saya, dan saya sumber .bashrc di .bash_profile saya.


sumber
Apakah Anda akan nyaman postingan Anda .bashrcdan .bash_profilefile di suatu tempat sehingga saya bisa melihat mereka? Masalah yang saya hadapi ketika melakukan hal serupa adalah PATHakan bertambah setiap kali saya membuat contoh layar baru karena akan mewarisi yang lama PATHdan kemudian menambahkan kembali semuanya lagi.
Tim Visher
Maaf Tim, saya tidak melihat ini ... Saya telah mengubah banyak hal di sekitar sehingga mereka tidak akan masuk akal, tetapi pada dasarnya ini yang saya lakukan. # .bash_profile if [-f ~ / .bashrc]; kemudian . ~ / .bashrc fi Lalu saya memasukkan semua yang lain ke dalam .bashrc, kecuali untuk hal-hal yang ingin saya mulai ketika saya pertama kali login, yang juga masuk .bash_profile. PATH ditangani dalam .bashrc sebagai serangkaian garis alih-alih satu definisi jalur seperti kebanyakan ekspor PATH = / path / ke / binaries1: $ PATH ekspor PATH = / path / ke / binaries2: $ PATH
0

Setiap kali saya memiliki beberapa masalah seperti yang saya buat file $HOME/.debugdan semua file yang bersumber / dijalankan selama login / shell doa (misalnya ~/.bashrc, ~/.bash_profile, ~/.profile, /etc/bashrc, dll) saya punya sebagai baris pertama

test -f $HOME/.debug && echo $HOME/.bashrc 1>&2

atau serupa. Untuk debugging khusus Anda juga dapat menambahkan hal-hal seperti

test -f $HOME/.debug && echo PATH now equals $PATH 1>&2

Dengan cara ini Anda dapat 100% benar-benar yakin file apa yang digunakan atau tidak.

Redirect ke stderr penting, Anda tidak ingin sesuatu mengacaukan stdout dalam banyak situasi.

hlovdal
sumber
0

Anda dapat tetap menggunakan .profile karena sistem tidak menyentuh bashrc (seperti sesi grafik) Sekarang Anda hanya memiliki dua set lingkungan yang berbeda - satu dari .profile, lainnya untuk bash dari .bashrc.

Zab
sumber