Codziennie używam ekranu do moich potrzeb terminalowych i jestem z tego całkiem zadowolony. Ostatnio jednak, zrobiłem kilka nowości do moich plików konfiguracyjnych bash i zauważyłem, że zachodziło różne PATH
elementy ( PATH
, MANPATH
, INFOPATH
, etc) w 2 miejscach. Zmodyfikowałem pliki, aby były takie, jakie powinny być, a teraz wszystkie moje zmienne środowiskowe są ustawione raz .bash_profile
. Na tym polega mój problem.
Najwyraźniej ustawiłem je w dwóch miejscach z powodu ekranu. Pojawi się ekran tylko wykonać .bashrc
i czy nie wydaje się, aby odziedziczyć moje PATH
lub innym środowisku zmiennych poprawnie z mojej oryginalnej powłoki bash. Ponieważ to tylko wykonuje, .bashrc
a teraz ustawiam tylko moje zmienne .bash_profile
, otrzymuję niekompletne PATH
.
Moje pytanie brzmi zatem, jak przenieść moje zmienne środowiskowe na ekran bez powielania. Czytanie Bash
dokumentów wydaje się wskazywać, że może to być rodzaj powłoki używanej przez ekran do logowania, tj. Interaktywna powłoka bez logowania, ale nie mogłem wymyślić, jak zmusić ekran do korzystania z określonego rodzaju powłoki, tylko powłoka do użycia przez -s /bin/bash
.
Możesz przeglądać moje pliki konfiguracyjne na mojej stronie GitHub . To jest zatwierdzenie, które zepsuło ekran .
EDYCJA: Używam Screen version 4.00.03 (FAU) 23-Oct-06
i zwykle wywołuję toscreen -h 50000
EDYCJA: Byłem w stanie przetestować to na Cygwin ( CYGWIN_NT-5.1 1.7.1(0.218/5/3) i686
, Screen version 4.00.03 (FAU) 23-Oct-06
) i wykazuje inne zachowanie niż na moim Macu.
Specyficzne zachowanie, które teraz odkryłem, polega na tym, że w Cygwin zmiany, które wprowadzam PATH
w .bash_profile, są powielane po wejściu na screen, a następnie kolejne tworzenie okien ekranowych nie powielają ścieżki, ale ponownie źródłują .bash_profile.
Aby zilustrować zachowanie, o którym mówię:
Wyjście z nowego terminala:
...
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 ../..'
...
[~]$
Wynik pierwszego wywołania screena:
[~]$ 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 ../..'
...
[~]$
Kolejne połączenia z 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 ../..'
...
[~]$
Możesz zobaczyć
źródło
Odpowiedzi:
zmienne ekranowe i środowiskowe
Domyślnie screen przekazuje swoje powłoki (i inne procesy) niezależnie od zmiennych środowiskowych, które miał w momencie rozpoczęcia sesji (tj. Ponowne połączenie nie zmienia zmiennych środowiskowych, które są podawane nowym powłokom). Ponieważ jednak zarówno pliki konfiguracyjne ekranu, jak i powłok często zmieniają zmienne środowiskowe, istnieje wiele miejsc, w których można wprowadzić nieoczekiwane zmiany. Istnieje kilka zmiennych, takich jak TERM , które ekran prawie zawsze się zmienia, ale są one generalnie wymagane dla funkcji, które zapewnia screen .
Powiedzmy, że ani konfiguracja twojej powłoki, ani konfiguracja ekranu nie zmodyfikuje zmiennej o nazwie FOOBAR (całkiem prawdopodobne, w sumie). Jeśli rozpoczniesz sesję
FOOBAR=foo screen
, wszystkie powłoki utworzone w tej sesji będą miały zmienną środowiskową o nazwie FOOBAR o wartościfoo
.Sprawy stają się bardziej skomplikowane w przypadku zmiennych, które albo screen albo twoja powłoka mogą modyfikować.
Brakujące ustawienia podczas korzystania z ekranu
Powłoki logowania
Jeśli okaże się, że brakuje niektórych ustawień w powłokach uruchamianych za pomocą ekranu , przyczyną może być to, że powłoka jest skonfigurowana tylko do aktualizacji tych ustawień dla powłok „logujących się”. Większość muszle zrozumieć specjalną konwencję (C:
**argv == '-'
), że ekran może być skonfigurowany do użycia.Według dokumentacji ekranu :
Aby mieć powłoki startowe ekranu jako powłoki logowania, uruchom ekran za pomocą
screen -s -/bin/bash
lub dodaj tę linię do.screenrc
:Dostosuj ścieżkę do dowolnej powłoki, której używasz.
Konfiguracja ekranu
Brakujące lub resetowane zmienne środowiskowe mogą być również spowodowane poleceniami
setenv
iunsetenv
poleceniami w pliku konfiguracyjnym ekranu . Trzeba będzie sprawdzić zarówno .screenrc w swoim katalogu domowym i dowolnie plik Twoja kompilacja ekranu używa jako „screenrc system” (można spróbować polecenia jakstrings "$(which screen)" | fgrep -i screenrc
znaleźć ścieżkę, która została skonfigurowana w czasie kompilacji, jest to zwykle / etc / screenrc dla ekranu instalowanego przez system ; instalacje dodatków prawdopodobnie użyją innej nazwy ścieżki). Możesz użyć,SCREENRC=/dev/null SYSSCREENRC=/dev/null screen
aby tymczasowo uniknąć tych plików ustawień, ale istnieje opcja czasu kompilacji, która uniemożliwia skuteczne użycie SYSSCREENRC (przypuszczalnie po to, aby administratorzy systemu mogli wymusić trochę wstępnej konfiguracji).Powiel ustawienia podczas korzystania z ekranu
Dość powszechne jest dodawanie elementów do zmiennej środowiskowej, takiej jak PATH, w plikach konfiguracyjnych powłoki, aby zaktualizowana wartość była dostępna dla normalnych sesji powłoki (np. Xterm lub innych okien terminali, sesji konsoli itp.). Jeśli takie elementy zostaną dodane w konfiguracji powłoki na powłokę (lub, jeśli używasz
-/path/to/shell
ustawienia opisanego powyżej, w konfiguracji logowania na powłoki), wówczas powłoka uruchomiona przez screen prawdopodobnie będzie miała wiele kopii dodanych elementów.Jedną ze strategii, aby tego uniknąć, jest umieszczenie wszystkich dodatków do zmiennych, takich jak PATH, w konfiguracji logowania dla powłoki i unikanie używania
-/path/to/shell
ustawień powłoki z ekranem .Inną strategią jest tylko warunkowo dodawanie nowych elementów do zmiennej. Zależnie od powłoki, kod do wykonania tego może być nieco skomplikowany, ale zwykle może być enkapsulowany w funkcji powłoki dla łatwego użycia.
Jeszcze inną strategią jest zawsze zaczynać od stałej wartości w plikach konfiguracyjnych. Może to czasami powodować problemy podczas przenoszenia plików konfiguracyjnych z systemu do systemu, gdy wartości domyślne mogą się znacznie różnić.
Diagnostyka
Jeśli nie możesz bezpośrednio zauważyć, gdzie następuje konkretna modyfikacja, możesz wypróbować następujące czynności, aby wyśledzić, gdzie następuje zmiana.
Sprawdź bieżącą wartość w początkowej powłoce:
Sprawdź, jak sama powłoka modyfikuje wartość podczas tworzenia podpowłoki:
Sprawdź, jak powłoka modyfikuje wartość, gdy tworzona jest podpowłoka „login”:
Sprawdź, jak screen modyfikuje wartość:
źródło
screen -s -/bin/bash
ale nie zachowuje się, ponieważ spodziewałem się, że będzie działał pod Cygwin na mojej maszynie roboczej . Na tej maszynie uruchamiamscreen -h 50000
i po prostu dziedziczy mójPATH
plik bez ponownego pobierania pliku. Działa to zarówno za każdym razem, gdy uruchamiam nowe okno.FOOBAR=baz screen
sprawdzićecho $FOOBAR
w oknach powłoki odscreen
iscreen -s -/bin/bash
. Obie odmiany powinny miećFOOBAR
=baz
. Jeśli twójPATH
jest modyfikowany, będziesz musiał wyśledzić, co to robi. SpróbujSYSSCREENRC=/dev/null SCREENRC=/dev/null screen
, jeśli to pozwoli ciPATH
przejść, prawdopodobnie jest tosetenv PATH
w/etc/screenrc
lub~/.screenrc
. W przeciwnym razie.bashrc
robisz to.Ostatnim razem, gdy zobaczyłem podobny problem, rozwiązałem go, używając
screen -l
ekranu startowego.Możesz użyć tej
-l
opcji podczas wywoływaniascreen
(włącz tryb logowania ; kontrolowany również przez poleceniadeflogin
ilogin
w.screenrc
), aby ustawić, czy screen ma domyślnie logować okno (dodawanie / usuwanie wpisu / etc / utmp).Tryb logowania jest domyślnie włączony, ale można go zmienić podczas kompilacji. Jeśli screen nie jest skompilowany z obsługą utmp, te polecenia nie są dostępne.
Wydaje mi się, że nie potrzebuję
-l
trybu na domyślnym ekranie Debiana Lenny'ego (v4.0.3); wydaje się być domyślnie włączony. Mój~/.profile
i~/.bashrc
są poprawnie czytane. Jak się przywołujeszscreen
? Jakiej wersji używasz?źródło
screen -ln
powinienem uruchamiać mojej , a ona wciąż działa. więc spróbuj flagi, ale to prawdopodobnie nie jest właściwa odpowiedź. na razie zostawię to tutaj.~/.profile
-l
-l
kontroluje tylko to, czyscreen
dodaje pozycję doutmp
pliku, a nie to, czy wywołuje nowe powłoki z własną-l
opcją, czy używa-
niestandardowej opcji exec-with- prefix.Problem leży w zachowaniu uruchomionym na Leopardzie. Zobacz ten raport o błędach MacPorts na ekranie Leoparda, aby zobaczyć, dlaczego nie zostanie naprawiony, dopóki nie uda ci się w jakiś sposób cofnąć uruchomionej wersji Snow Leoparda.
https://trac.macports.org/ticket/18235#comment:26
źródło
Nie ma nic złego w pozyskiwaniu .bashrc z .bash_profile. Jeśli używasz swojego komputera tylko lokalnie, twój .bash_profile będzie w większości przypadków pozyskiwany tylko podczas pierwszego logowania (oczywiście są inne czasy, gdy jest on pozyskiwany).
Organizuję pliki tak, że jeśli chcę coś zrobić tylko podczas logowania, umieszczam informacje w pliku .bash_profile, a dla wszystkich innych - w pliku .bashrc. ŚCIEŻKA to jedna rzecz, którą umieściłem w moim .bashrc, a ja pozyskuję .bashrc w moim .bash_profile.
źródło
.bashrc
i.bash_profile
pliki, bym mógł je zobaczyć? Problem, na który natknąłem się podczas robienia czegoś podobnego, polegał na tym,PATH
że narastałam za każdym razem, gdy tworzyłem nową instancję ekranu, ponieważ odziedziczyłaby starą,PATH
a następnie ponownie dodała wszystko.Kiedy mam jakiś problem, że jak utworzyć plik
$HOME/.debug
i wszystkie pliki pozyskiwane / wykonywany podczas logowania / shell wywołania (np~/.bashrc
,~/.bash_profile
,~/.profile
,/etc/bashrc
, etc) Mam w pierwszej liniilub podobne. Do konkretnego debugowania możesz także dodać takie rzeczy jak
W ten sposób możesz być w 100% absolutnie pewien, jakie pliki są lub nie są używane.
Przekierowanie do stderr jest ważne, w wielu sytuacjach nie chcesz, aby coś popsuło standardowe wyjście.
źródło
Możesz pozostać przy .profile, ponieważ system nie dotyka bashrc (jak sesja graficzna) Teraz masz po prostu dwa różne zestawy środowisk - jeden z .profile, a drugi dla bash z .bashrc.
źródło