GNU Ekranı 10.5.8'de PATH'ımı devralmayacak


11

Ekranı terminal ihtiyaçları için günlük olarak kullanıyorum ve bundan oldukça memnunum. Ancak, son zamanlarda benim bash yapılandırma dosyaları bazı güncellemeler yaptı ve ben çeşitli batıyordu fark PATH(elementleri PATH, MANPATH, INFOPATH2 yerlerde, vs). Dosyaları olması gerektiği gibi değiştirdim ve şimdi tüm ortam değişkenlerim bir kez ayarlandı .bash_profile. Burada benim sorunum yatıyor.

Görünüşe göre, onları iki yere koymamın nedeni ekran yüzünden oldu. ekranı yalnızca yürütülüyor .bashrcgibi görünüyor ve benim veya diğer ortam değişkenlerini orijinal bash kabuğumdan doğru bir şekilde miras almıyor gibi görünüyor PATH. Sadece yürüttüğü .bashrcve şimdi değişkenlerimi .bash_profileyalnızca ayarladığım için, eksikim var PATH.

O zaman sorum, ortam değişkenlerimi çoğaltma olmadan ekrana nasıl getireceğidir. BashDokümanlar üzerinden okumak , ekranın oturum açmak için kullandığı kabuk türünün, yani giriş yapmayan etkileşimli bir kabuk olabileceğini gösteriyor gibi görünüyor, ancak ekranı belirli bir kabuk türünü kullanmaya nasıl zorlayacağımı anlayamadım, sadece kabuk kullanmak için -s /bin/bash.

Yapılandırma dosyalarımı GitHub sayfamda inceleyebilirsiniz . Bu ekran kırılan taahhüt taahhüdüdür .

EDIT: kullanıyorum Screen version 4.00.03 (FAU) 23-Oct-06ve ben tarafından çağırmak eğilimindedirscreen -h 50000

DÜZENLEME: Şimdi bunu Cygwin ( CYGWIN_NT-5.1 1.7.1(0.218/5/3) i686, Screen version 4.00.03 (FAU) 23-Oct-06) üzerinde test edebildim ve Mac'imden farklı bir davranış sergiliyor.

Şimdi keşfettiğim özel davranış, PATHCygwin'de .bash_profile içinde yaptığım değişikliklerin ekrana girdikten sonra çoğaltılması ve ardından ekran pencerelerinin art arda oluşturulması yolun çoğaltılmaması, ancak .bash_profile'ın yeniden kaynaklanmasıdır.

Bahsettiğim davranışı göstermek için:

Yeni bir terminalden çıkış:

...

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 ../..'

...

[~]$

Ekranın ilk çağrılmasından çıktı:

[~]$ 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 ../..'

...

[~]$

Sonraki çağrılar 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 ../..'

...

[~]$

Görebilirsin


Eğer var çünkü çoğaltılması olduğunu bash bir 'giriş' kabuk ile koşulsuz bu girdileri eklemek üzere yapılandırılmış ve anlatıyorsun ekranını çağırmak için bash bir 'giriş' kabuk olarak. Kabuğumun, ekranın ve ortam değişkenlerinin genel sorunlarını ele almaya çalışmak için cevabımı yeniden yazdım .
Chris Johnsen

Yanıtlar:


16

ekran ve Ortam Değişkenleri

Varsayılan olarak, ekran , oturum başlatıldığında sahip olduğu ortam değişkenleri ne olursa olsun kabuklarına (ve diğer işlemlere) geçer (yani yeniden bağlanma, yeni kabuklara hangi ortam değişkenlerinin verildiğini değiştirmez). Ancak hem ekranın hem de kabukların yapılandırma dosyaları genel olarak ortam değişkenlerini değiştirdiğinden, beklenmedik değişikliklerin sunulabileceği birçok yer vardır. Orada gibi birkaç değişkenler şunlardır ŞART , taramak neredeyse her zaman değişir, ama bunlar genellikle bu işleve için gerekli olan ekran sağlar.

Diyelim ki ne kabuğunuzun yapılandırması ne de ekran yapılandırması FOOBAR adlı bir değişkeni değiştirmeyecek (oldukça muhtemel, sonuçta). Eğer bir oturumu başlatmak durumunda FOOBAR=foo screen, bu oturumda oluşturulan sonra tüm kabuklar adında bir ortam değişkeni olacak FOOBAR değeriyle foo.

Ekranın veya kabuğunuzun değiştirebileceği değişkenler için işler daha karmaşık hale gelir .

Ekranı Kullanırken Eksik Ayarlar

Giriş Kabukları

Ekran tarafından başlatılan kabuklarda bazı ayarların eksik olduğunu görürseniz , bunun nedeni kabuğunuzun yalnızca bu ayarları 'giriş' kabukları için güncelleyecek şekilde yapılandırılmış olması olabilir. Çoğu kabuk **argv == '-', ekranın kullanmak üzere yapılandırılabileceği özel bir kuralı (C: cinsinden) anlar .

Başına ekran belgelerinde :

kabuk komutu

Yeni bir kabuk oluşturmak için kullanılacak komutu ayarlayın. Bu, $ SHELL ortam değişkeninin değerini geçersiz kılar. $ SHELL içinde belirtilen programı yürütmeyi bekleyen bir tty arttırıcı çalıştırmak istiyorsanız bu yararlıdır. Komut bir '-' karakteriyle başlarsa, kabuk bir giriş kabuğu olarak başlatılır.

Sahip olmak ekranı , 'giriş' kabukları olarak başlangıç kabukları başlatmak ekranı ile screen -s -/bin/bashveya bu satırı ekleyin .screenrc:

shell -/bin/bash

Kullandığınız kabuğun yolunu ayarlayın.

ekran Yapılandırma

Ortam değişkenlerinin eksik veya sıfırlanması bir ekran yapılandırma dosyasındaki setenvve unsetenvkomutlarındaki komutlardan da kaynaklanabilir . Hem ana dizininizdeki .screenrc'yi hem de ekran derlemenizin hangi dosyayı 'sistem screenrc' olarak kullandığını kontrol etmeniz gerekecektir ( derleme zamanında yapılandırılan yol adını bulmak gibi bir komutu deneyebilirsiniz ; genellikle / Sistem yüklü bir ekran için etc / screenrc ; eklenti yüklemeleri muhtemelen başka bir yol adı kullanır). Bu ayar dosyalarından geçici olarak kaçınmak için kullanabilirsiniz , ancak SYSSCREENRC'nin etkin kullanımını önleyen bir derleme zamanı seçeneği vardırstrings "$(which screen)" | fgrep -i screenrcSCREENRC=/dev/null SYSSCREENRC=/dev/null screen (muhtemelen sistem yöneticilerinin bir miktar başlangıç ​​yapılandırmasını zorlayabilmesi için).

Ekranı Kullanırken Yinelenen Ayarlar

Kabuğun yapılandırma dosyalarında PATH gibi bir ortam değişkenine öğe eklemek oldukça yaygındır, böylece güncellenen değer normal kabuk oturumları için kullanılabilir (örn. Xterm veya diğer terminal pencereleri, konsol oturumları, vb.). Bu tür öğeler bir kabuğun kabuk başına yapılandırmasına eklenirse (veya -/path/to/shellyukarıda açıklanan ayarı, oturum başına kabuk yapılandırmasında kullanıyorsanız), ekran tarafından başlatılan kabukta muhtemelen eklenen öğelerin birden fazla kopyası olacaktır.

Bundan kaçınmak için bir strateji , kabuğunuzun giriş başına yapılandırmasına PATH gibi değişkenlere tüm eklemeler koymak ve -/path/to/shellkabuk ayarını ekranla kullanmaktan kaçınmaktır .

Başka bir strateji de değişkene sadece yeni öğeleri koşullu olarak eklemektir. Kabuğa bağlı olarak, bunu yapmak için kod biraz karmaşık olabilir, ancak genellikle kolay kullanım için bir kabuk işlevinde kapsüllenebilir.

Yine başka bir strateji, yapılandırma dosyalarınızda her zaman sabit bir değerle başlamaktır. Bu, bazen varsayılan değerlerin önemli ölçüde değişebileceği durumlarda yapılandırma dosyalarınızı sistemden sisteme taşırken sorunlara neden olabilir.

Teşhis

Belirli bir değişikliğin nerede gerçekleştiğini doğrudan tespit edemiyorsanız, değişikliğin nerede gerçekleştiğini izlemek için aşağıdakileri deneyebilirsiniz.

İlk kabuğunuzdaki geçerli değeri kontrol edin:

echo "$PATH"

Bir alt kabuk oluşturulduğunda kabuğun kendisinin değeri nasıl değiştirdiğini kontrol edin:

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

Bir 'login' alt kabuğu oluşturulduğunda kabuğun değeri nasıl değiştirdiğini kontrol edin:

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

Ekranın değeri nasıl değiştirdiğini kontrol edin :

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

Bu, sorunumun bir kısmını çözüyor. Ne yazık ki tam yoluna gitmiyor. Şimdi, ekran iyi çalışıyor, screen -s -/bin/bashancak iş makinemde Cygwin altında davranmasını beklediğim gibi davranmıyor. Bu makinede, çalıştırıyorum screen -h 50000ve PATHdosyayı tekrar kaynaklamadan basitçe devralır . Bu, her yeni pencere başlattığımda çalışır.
Tim Visher

Ekran sürecinin ortamı her zaman kendi çocukları tarafından miras alınmalıdır (TERM gibi geçersiz kılabilecekler hariç). Deneyin FOOBAR=baz screenve check echo $FOOBARgelen kabuk pencerelerde screenve screen -s -/bin/bash. Her iki varyasyon da FOOBAR= olmalıdır baz. Eğer PATHdeğiştiriliyorsa, ne yaptığını izlemeniz gerekir. Deneyin SYSSCREENRC=/dev/null SCREENRC=/dev/null screen, eğer bu size izin verirse PATH, o zaman muhtemelen bir setenv PATHin /etc/screenrcveya ~/.screenrc. Aksi takdirde sizin .bashrcyaptığınız bir şeydir .
Chris Johnsen

Cevabımı büyük bir şekilde yeniden yazdım / ekledim.
Chris Johnsen

2

Benzer bir sorunu en son gördüğümde, screen -lekranı başlatırken kullanarak çözdüm.

Sen kullanabilirsiniz -lçağrılırken seçeneği screen(dönüş giriş modunu aynı zamanda kontrol üzerine defloginve loginkomutlar içinde .screenrcekran varsayılan olarak pencereyi log gerekip gerekmediğini setine (/ etc / utmp girdisini ekleme / kaldırma)).

Oturum açma modu varsayılan olarak açıktır, ancak bu derleme zamanında değiştirilebilir. Ekran utmp desteği ile derlenmezse bu komutlar kullanılamaz.

-lDebian Lenny'nin varsayılan ekranında (v4.0.3) moda ihtiyacım yok ; varsayılan olarak açık görünüyor. Benim ~/.profileve ~/.bashrcdoğru okunuyor. Nasıl çağırıyorsun screen? Hangi sürümü kullanıyorsunuz?


tho bu teorinin altında screen -lnolmalıdır değil gözlerimi çalıştırmak ~/.profileve hala çalıştırılmasına. Bu yüzden -lbayrağı deneyin , ancak bu muhtemelen doğru cevap değildir. bir an için burada bırakacak.
quack quixote

Görünüşe göre, -lyalnızca kendi seçenekleriyle yeni kabuklar çağırıp çağırmayacağını veya exec- with -- prefix özelliğini kullanıp kullanmadığını değil screen, utmpdosyaya bir giriş ekleyip eklemeyeceğini kontrol eder. -l-
Chris Johnsen


1

.Bashrc dosyanızı .bash_profile içinden kaynaklamakta yanlış bir şey yoktur. Makinenizi yalnızca yerel olarak kullanıyorsanız, .bash_profile dosyanız çoğu durumda yalnızca ilk girişinizi yaptığınızda kaynaklanacaktır (kaynaklandığı belli zamanlar vardır).

Dosyalarımı sadece giriş yaptığımda bir şey yapılmasını istiyorsam, bilgileri .bash_profile dosyasına ve diğer her şey için .bashrc içine koyduğum şekilde düzenlerim. PATH .bashrc dosyama koyduğum bir şeydir ve .bashrc kaynağımı .bash_profile dosyama ekliyorum.


Dosyalarınızı .bashrcve .bash_profiledosyalarınızı bir yerde yayınlayabilmeniz için rahat olur musunuz? Benzer bir şey yaparken karşılaştığım sorun PATH, yeni bir ekran örneği oluşturduğumda her zaman büyüyecekti, çünkü eskisini devralacak PATHve her şeyi tekrar ekleyecekti.
Tim Visher

Üzgünüm Tim, bunu görmedim ... Çok fazla şey değiştirdim, bu yüzden pek bir anlam ifade etmeyecekler, ama temelde yaptığım bu. # .bash_profile eğer [-f ~ / .bashrc]; sonra . ~ / .bashrc fi Sonra ilk giriş yaptığımda başlamak istediğim şeyler dışında .bash_profile olan diğer her şeyi .bashrc içine koydum. PATH .bashrc içinde çoğu yol gibi bir yol tanımı yerine bir dizi satır olarak işlenir. PATH = / path / to / binaries1: $ PATH export PATH = / path / to / binaries2: $ PATH

0

Bir dosya oluşturmak böyle bazı sorun yaşadığımızda $HOME/.debugve tüm dosyaları içinde (örneğin giriş / kabuk çağrı sırasında çalıştırılan / kaynaklı ~/.bashrc, ~/.bash_profile, ~/.profile, /etc/bashrc, vs) ilk satırı olarak var

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

veya benzeri. Belirli hata ayıklama için aşağıdaki gibi şeyleri de ekleyebilirsiniz

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

Bu şekilde hangi dosyaların kullanılıp kullanılmadığından% 100 kesin olarak emin olabilirsiniz.

Stderr'e yönlendirme önemlidir, birçok durumda stdout'u berbat etmek istemezsiniz.


0

Sistem bashrc'ye (grafik oturumu gibi) dokunmadığından .profile ile kalabilirsiniz. Şimdi sadece biri .profile, diğeri .bashrc'den bash için olmak üzere iki farklı ortam setine sahipsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.