GNU Screen은 10.5.8에서 PATH를 상속받지 않습니다.


11

터미널 요구에 따라 매일 화면을 사용하고 있으며 매우 만족합니다. 최근,하지만 난 내 bash는 구성 파일에 일부 업데이트를했고 나는 다양한 설정을 한 것으로 나타났습니다 PATH(요소 PATH, MANPATH, INFOPATH2 곳 등). 파일을 원래대로 수정했으며 이제 모든 환경 변수가에서 한 번 설정되었습니다 .bash_profile. 여기 내 문제가 있습니다.

분명히 두 곳에서 설정 한 이유는 화면 때문이었습니다. screen은 단지 실행되는 것처럼 보이며 원래 bash 쉘에서 내 환경 변수 또는 다른 환경 변수를 올바르게 상속 .bashrc하지 않은 것으로 보입니다 PATH. 실행 .bashrc되고 변수를 설정 하기 때문에 .bash_profile불완전 PATH합니다.

그렇다면 제 질문은 환경 변수를 복제하지 않고 화면에 표시하는 방법입니다. Bash문서를 읽으면 화면에 로그인하는 데 사용되는 일종의 쉘, 즉 비 로그인 대화 형 쉘 일 수 있지만 화면에서 특정 종류의 쉘을 사용하도록 강제하는 방법을 알 수는 없었습니다. 를 통해 사용할 쉘 -s /bin/bash.

내 GitHub 페이지 에서 구성 파일을 살펴볼 수 있습니다 . 이것은 화면을 깨뜨린 커밋 커밋입니다 .

편집 : 사용 Screen version 4.00.03 (FAU) 23-Oct-06하고 있으며 호출하는 경향이 있습니다.screen -h 50000

편집 : 이제 Cygwin ( CYGWIN_NT-5.1 1.7.1(0.218/5/3) i686, Screen version 4.00.03 (FAU) 23-Oct-06) 에서 이것을 테스트 할 수 있었고 Mac과 다른 동작을 보입니다.

내가 지금 발견 한 구체적인 동작은 Cygwin PATH에서 .bash_profile에서 변경 한 내용이 화면을 입력 할 때 복제 된 다음 화면 창을 연속적으로 만들면 경로가 복제되지 않지만 .bash_profile을 다시 가져 오는 것입니다.

내가 말하는 행동을 설명하기 위해 :

새로운 터미널에서 출력 :

...

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

...

[~]$

첫 번째 화면 호출 결과 :

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

...

[~]$

다음에 대한 호출 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 ../..'

...

[~]$

너는 볼 수있어


당신이 있기 때문에 중복은 배쉬는 그것이 '로그인'셸과 무조건 항목을 추가로 구성, 당신은 말하고있다 화면 호출 용으로 떠들썩한 파티 에 '로그인'쉘있다. 쉘, 화면 및 환경 변수 의 일반적인 문제를 해결하기 위해 답을 다시 작성했습니다 .
크리스 존슨

답변:


16

화면 및 환경 변수

기본적으로 화면 은 세션이 시작될 때의 환경 변수에 관계없이 쉘 (및 기타 프로세스)에 전달됩니다 (즉, 다시 연결해도 새 쉘에 제공되는 환경 변수는 변경되지 않습니다). 그러나 화면 과 셸의 구성 파일은 일반적으로 환경 변수를 변경 하기 때문에 예기치 않은 변경이 발생할 수있는 곳이 많이 있습니다. 이 같은 몇 가지 변수입니다 TERM , 화면 은 거의 항상 변화는 있지만, 이러한 일반적으로 그 기능에 필요한 화면을 제공합니다.

쉘의 구성이나 screen 의 구성이 FOOBAR 라는 이름의 변수를 수정 하지 않는다고 가정 해 봅시다 . 로 세션을 시작하면 FOOBAR=foo screen해당 세션에서 작성된 모든 쉘 에 값이 FOOBAR 인 환경 변수가 있습니다 foo.

화면 이나 셸에서 수정할 수있는 변수가 더 복잡해집니다 .

화면을 사용할 때 누락 된 설정

로그인 쉘

screen으로 시작된 쉘에서 일부 설정이 누락 된 경우 , 쉘이 '로그인'쉘에 대한 해당 설정을 업데이트하도록 구성 되었기 때문일 수 있습니다. 대부분의 셸 **argv == '-'화면 을 사용하도록 구성 할 수 있는 특별한 규칙 (C :)을 이해합니다 .

화면 문서 :

명령

새 쉘을 작성하는 데 사용할 명령을 설정하십시오. 이는 환경 변수 $ SHELL의 값을 대체합니다. 이것은 $ SHELL에 지정된 프로그램을 실행할 것으로 예상되는 tty-enhancer를 실행하려는 경우에 유용합니다. 명령이 '-'문자로 시작하면 쉘은 로그인 쉘로 시작됩니다.

이하려면 화면의 '로그인'쉘로 시작 쉘을 시작 화면 으로 screen -s -/bin/bash, 또는이 줄을 추가합니다 .screenrc:

shell -/bin/bash

사용중인 쉘의 경로를 조정하십시오.

화면 구성

화면 구성 파일의 setenvunsetenv명령 으로 인해 환경 변수가 누락되거나 재설정 될 수 있습니다 . 홈 디렉토리 의 .screenrc화면 컴파일 에서 'system screenrc'로 사용중인 파일을 모두 확인해야합니다 ( 컴파일 시간에 구성된 경로 이름을 찾는 것과 같은 명령을 시도 할 수 있음-일반적으로 / 시스템 설치 화면의 경우 etc / screenrc ; 애드온 설치는 아마도 다른 경로 이름을 사용합니다). 이러한 설정 파일을 일시적으로 피하는 데 사용할 수 있지만 SYSSCREENRC 의 효과적인 사용을 방해하는 컴파일 타임 옵션이 있습니다.strings "$(which screen)" | fgrep -i screenrcSCREENRC=/dev/null SYSSCREENRC=/dev/null screen (아마 시스템 관리자가 약간의 초기 구성을 강제 할 수 있도록)

화면 사용시 중복 설정

쉘의 구성 파일에서 PATH 와 같은 환경 변수에 항목을 추가 하여 업데이트 된 값을 일반 쉘 세션 (예 : xterm 또는 기타 터미널 창, 콘솔 세션 등)에 사용할 수 있도록하는 것이 일반적 입니다. 그러한 항목이 쉘의 쉘별 구성 (또는 -/path/to/shell위에서 설명한 설정을 사용하는 경우 , 로그인 당 쉘 구성에서) 에 추가되면 화면에서 시작된 쉘 에 추가 된 항목의 사본이 여러 개있을 수 있습니다.

이를 피하는 한 가지 전략은 쉘의 로그인 별 구성에 PATH 와 같은 변수에 모든 추가 사항을 넣고 screen-/path/to/shell 과 함께 쉘 설정을 사용하지 않는 것 입니다.

또 다른 전략은 조건부로만 새 항목을 변수에 추가하는 것입니다. 셸에 따라이 작업을 수행하는 코드는 약간 복잡 할 수 있지만 일반적으로 쉽게 사용하기 위해 셸 함수로 캡슐화 할 수 있습니다.

또 다른 전략은 항상 구성 파일에서 고정 값으로 시작하는 것입니다. 기본값이 크게 다를 수있는 경우 구성 파일을 시스템에서 시스템으로 이동할 때 문제가 발생할 수 있습니다.

진단

특정 수정이 발생한 위치를 직접 확인할 수없는 경우 다음을 시도하여 변경이 발생한 위치를 추적 할 수 있습니다.

초기 쉘에서 현재 값을 확인하십시오.

echo "$PATH"

하위 쉘이 작성 될 때 쉘 자체가 값을 수정하는 방법을 확인하십시오.

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

'로그인'서브 쉘이 작성 될 때 쉘이 값을 수정하는 방법을 확인하십시오.

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

화면 이 값을 어떻게 수정 하는지 확인하십시오 .

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

이것은 내 문제의 일부를 해결합니다. 불행히도 그것은 완전히 진행되지 않습니다. 이제 화면이 잘 작동 screen -s -/bin/bash하지만 작업 기계의 Cygwin에서 작동 할 것으로 기대 되는대로 작동하지 않습니다. 그 기계에서 나는 실행 screen -h 50000하고 PATH실제로 파일을 다시 소싱하지 않고 단순히 상속 합니다. 이것은 새 창을 시작할 때마다 실행됩니다.
Tim Visher

스크린 프로세스 의 환경 은 항상 그 자식에 의해 상속되어야합니다 (TERM과 같은 것들은 무시할 수 있습니다). 시도 FOOBAR=baz screen및 확인 echo $FOOBAR에서 쉘 창에 screenscreen -s -/bin/bash. 두 변형 모두 FOOBAR= 이어야합니다 baz. PATH수정중인 경우 수행중인 작업을 추적해야합니다. 시도해보십시오 SYSSCREENRC=/dev/null SCREENRC=/dev/null screen. PATH통과가 가능하다면 아마도 setenv PATHin /etc/screenrc또는 ~/.screenrc입니다. 그렇지 않으면 그것은 당신 .bashrc이하고있는 일입니다.
Chris Johnsen

나는 나의 대답에 대한 큰 재 작성을 덧붙였다.
Chris Johnsen

2

마지막으로 비슷한 문제가 발생 screen -l했을 때 화면을 시작할 때 사용하여 문제를 해결했습니다 .

-l호출 할 때 screen( 로그인 모드 설정; deflogin및의 login명령으로 제어) 옵션을 사용하여 .screenrc화면에 기본적으로 창을 로그인할지 (/ etc / utmp 항목 추가 / 제거)를 설정할 수 있습니다.

로그인 모드는 기본적으로 켜져 있지만 컴파일시 변경할 수 있습니다. 화면이 utmp 지원으로 컴파일되지 않은 경우 이러한 명령을 사용할 수 없습니다.

-l데비안 레니의 기본 화면 (v4.0.3)에서 모드 가 필요하지 않은 것 같습니다 . 기본적으로 켜져있는 것 같습니다. 나의 ~/.profile그리고 ~/.bashrc올바르게 읽고 있습니다. 어떻게 불러요 screen? 어떤 버전을 사용하고 있습니까?


상점은이 이론에 따라, screen -ln해야 하지 내 실행 ~/.profile, 그것은 여전히 실행됩니다. 따라서 -l깃발을 사용해보십시오. 그러나 이것은 정답이 아닙니다. 잠시 동안 여기에 남겨 두겠습니다.
quack quixote

자체 옵션으로 새 쉘을 호출 하거나 exec-with- -fix 접두사를 사용 하는지 여부가 아니라 파일에 항목을 추가 -l할지 여부 만 제어하는 것으로 보입니다 . screenutmp-l-
Chris Johnsen


1

.bash_profile 내에서 .bashrc를 소싱하는 데 아무런 문제가 없습니다. 컴퓨터를 로컬로만 사용하는 경우 대부분의 경우 초기 로그인을 할 때만 .bash_profile이 소스로 제공됩니다 (다른 경우에는 소스가 제공됩니다).

나는 로그인 할 때만 무언가를 원한다면 정보를 .bash_profile에 넣고 다른 모든 것을 .bashrc에 넣도록 파일을 구성합니다. PATH는 내 .bashrc에 넣은 것 중 하나이며 .bashrc는 .bash_profile에 있습니다.


내가 볼 수 있도록 귀하 .bashrc.bash_profile파일을 어딘가에 게시하는 것이 편안 합니까? 비슷한 작업을 수행하는 동안 발생한 문제 PATH는 이전 화면을 상속 한 PATH다음 모든 것을 다시 추가 하기 때문에 새 화면 인스턴스를 만들 때마다 증가 한다는 것 입니다.
Tim Visher

미안 팀, 나는 이것을 보지 못했다 ... 나는 많은 것들을 바꿔서 이해가되지 않을 것이지만 이것이 기본적으로 내가하는 일입니다. # .bash_profile if [-f ~ / .bashrc]; 그때. ~ / .bashrc fi 그런 다음 처음 로그인 할 때 시작하려는 것을 제외하고 .bashrc에 다른 모든 것을 넣었습니다. PATH는 대부분 .bashrc에서 하나의 경로 정의 대신 일련의 행으로 처리됩니다. export PATH = / path / to / binaries1 : $ PATH export PATH = / path / to / binaries2 : $ PATH

0

나는 파일을 생성 그렇게 좀 문제가있을 때마다 $HOME/.debug및 모든 파일에 (예 : 로그인 / 쉘 호출 동안 실행 / 공급 ~/.bashrc, ~/.bash_profile, ~/.profile, /etc/bashrc, 등) 내가 첫 번째 줄이

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

또는 유사합니다. 특정 디버깅을 위해 다음과 같은 것을 추가 할 수도 있습니다

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

이런 식으로 어떤 파일이 사용되는지 아닌지를 100 % 확실하게 확신 할 수 있습니다.

stderr로 리디렉션하는 것이 중요합니다. 많은 상황에서 stdout을 망치는 것을 원하지 않습니다.


0

시스템이 그래픽 세션과 같은 bashrc를 건드리지 않기 때문에 .profile을 유지할 수 있습니다. 이제 .profile의 환경과 .bashrc의 bash를위한 두 가지 환경 세트가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.