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 PATH
elemen ( 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 .bashrc
dan tampaknya tidak mewarisi PATH
variabel lingkungan saya atau lainnya dengan benar dari shell bash asli saya. Karena hanya mengeksekusi .bashrc
dan saya sekarang mengatur variabel saya .bash_profile
saja, saya mendapatkan tidak lengkap PATH
.
Pertanyaan saya adalah bagaimana cara memasukkan variabel lingkungan saya ke layar tanpa duplikasi. Membaca Bash
dokumen 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-06
dan 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 PATH
di .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
sumber
Jawaban:
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 nilaifoo
.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 :
Untuk membuat shell start layar sebagai shell 'login', mulai layar dengan
screen -s -/bin/bash
, atau tambahkan baris ini ke.screenrc
:Sesuaikan jalur ke shell apa pun yang kebetulan Anda gunakan.
Konfigurasi layar
Variabel lingkungan yang hilang atau diatur ulang dapat juga disebabkan oleh
setenv
danunsetenv
perintah 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 sepertistrings "$(which screen)" | fgrep -i screenrc
mencari 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 menggunakanSCREENRC=/dev/null SYSSCREENRC=/dev/null screen
untuk 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/shell
pengaturan 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/shell
pengaturan 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:
Periksa bagaimana shell itu sendiri mengubah nilai ketika sub-shell dibuat:
Periksa bagaimana shell memodifikasi nilai ketika sub-shell 'login' dibuat:
Periksa bagaimana layar mengubah nilai:
sumber
screen -s -/bin/bash
tetapi tidak berperilaku seperti yang saya harapkan untuk berperilaku di bawah Cygwin pada mesin kerja saya. Di mesin itu, saya menjalankanscreen -h 50000
dan itu hanya mewarisi sayaPATH
tanpa benar-benar sumber file lagi. Ini berjalan baik setiap kali saya meluncurkan jendela baru.FOOBAR=baz screen
dan periksaecho $FOOBAR
di shell windows dariscreen
danscreen -s -/bin/bash
. Kedua variasi harus memilikiFOOBAR
=baz
. Jika AndaPATH
sedang dimodifikasi, maka Anda harus melacak apa yang sedang dilakukan. CobaSYSSCREENRC=/dev/null SCREENRC=/dev/null screen
, jika itu memungkinkan AndaPATH
melalui, maka mungkinsetenv PATH
dalam/etc/screenrc
atau~/.screenrc
. Kalau tidak, itu adalah sesuatu yang Anda.bashrc
lakukan.Terakhir kali saya melihat masalah serupa, saya menyelesaikannya dengan menggunakan
screen -l
saat memulai layar.Anda dapat menggunakan
-l
opsi saat memohonscreen
(aktifkan mode login ; juga dikendalikan olehdeflogin
danlogin
perintah 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
-l
mode di layar default Debian Lenny (v4.0.3); tampaknya diaktifkan secara default. Saya~/.profile
dan~/.bashrc
sedang dibaca dengan benar. Bagaimana kabarmuscreen
? Versi apa yang Anda gunakan?sumber
screen -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
-l
hanya mengontrol apakahscreen
menambahkan entri keutmp
file, bukan apakah itu memanggil shell baru dengan-l
opsi mereka sendiri atau menggunakan-
kustom exec- with- -prefix.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
sumber
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
.bashrc
dan.bash_profile
file di suatu tempat sehingga saya bisa melihat mereka? Masalah yang saya hadapi ketika melakukan hal serupa adalahPATH
akan bertambah setiap kali saya membuat contoh layar baru karena akan mewarisi yang lamaPATH
dan kemudian menambahkan kembali semuanya lagi.Setiap kali saya memiliki beberapa masalah seperti yang saya buat file
$HOME/.debug
dan semua file yang bersumber / dijalankan selama login / shell doa (misalnya~/.bashrc
,~/.bash_profile
,~/.profile
,/etc/bashrc
, dll) saya punya sebagai baris pertamaatau serupa. Untuk debugging khusus Anda juga dapat menambahkan hal-hal seperti
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.
sumber
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.
sumber