2016-08-07 5 views
0

bash에서 실행할 때 개별 프로세스의 IO를 파이프하고 리디렉션하는 기능에 익숙합니다. 그러나, 전체 bash 세션에 대해 stdio를 리디렉션 할 수있는 방법이 있습니까?bash 세션 전체를 로그 파일로 리디렉션

이상적 I 투명 파이프 tee 떠들썩한 파티에 의해 만들어지는 모든 공정 및 모든 stdoutstderr 파일에 사용자에게 디스플레이 인쇄물을 복제하고 싶다. bash 세션 내에서 어떤 프로세스가 실행 되더라도 나중에 다시 돌아가 출력을 살펴볼 수 있습니다.

더 이상적으로는 stdin에서 옵션을 가져 오는 단순한 대화 형 프로그램이지만 vim과 같은 대화 형 프로그램은 그렇지 않습니다.

지금까지 IS 찾은 최고의 : 사용자가 새 터미널을 열 때마다, 명령 실행

bash --login -i > >(tee ~/bash_$$.log) 2>&1 

이 바로 그 새로운 쉘에서 대화 형 아이 쉘을 시작합니다, 그리고 tee 모든 stdin 새 상위 쉘의 PID로 이름 지정된 로그 파일에 덮어 쓰기를 방지하기 위해 stderr을 추가하십시오.

이 작동하지만 vimVim: Warning: Output is not to a terminal으로 시작하지 못합니다. 이렇게하기 위해 셸을 패치하는 것까지 알려진 해결책이 있습니까?

+0

을 실행할 수 있습니까? –

+0

'vim> &/dev/pts/':) – pah

+0

물론, 확실히 OP는 로그가 회피되기를 원하지 않습니다. :) –

답변

4

배경 : 표준 출력을위한 파일 기술자 주어 졌을 때 isatty()가 false를 반환하기 때문에 vim 실패; 이것은 일반적으로 이해가되지 않는 vim >file과 같은 사용을 막는 보호 장치입니다. (또한 간단한 FIFO로는 사용할 수없는 그래픽 기반의 커서 지향 프로그램에 유용한 PTY와 상호 작용할 수있는 운영 체제 호출이 있으며이 때문에 ssh과 같은 도구는 대화식 사용 중에 의사 터미널을 제공하는 데 어려움을 겪습니다).

중요한 것은 vim이 파일 설명자를 직접 검사하여 stdout으로 전달된다는 것입니다. 쉘은 이것에 대한 당사자가 아닙니다. 오픈 파일 디스크립터에 대한 세부 정보를 얻는 것은 표준 C 라이브러리 호출을 실행하는 문자 그대로 vim입니다. 따라서 쉘을 패치하거나 재구성 할 수있는 것은 아무것도 아닙니다.

이렇게하지 않으려면 stdout과 stderr이 여전히 PTY를 가리 키도록 출력을 리디렉션하는 다른 방법을 찾아야합니다. (현재 위치에서 표준 출력을 리디렉션 대, 모든 활동을 기록)하여 실제 목표를 위해, 말했다


은, 당신이 원하는 것은 아마 script입니다 :

if [ -z "$redirection_done" ]; then 
    redirection_done=1 exec script shell.log bash --login -i 
fi 

는 다른 도구에서 로그인 지원을 사용하는 screen 또는 tmux과 같은 TTY를 시뮬레이트하는 것으로 충분합니다. (unbuffer, expect 툴킷에서 비슷한 효과를 얻을 수 있습니다).


위로 문자 질문에 ... (당신이 알고 싶은 것이 아닐 수도 있지만, 그것은 당신이 무엇을 요구 이후) : 배쉬를 포함한 모든 POSIX 쉘에서는

,

exec >wherever 

... 바로 표준 출력을 리디렉션합니다 현재 쉘의 경우 wherever입니다. 이것은 다른 곳에서도 bash에서 프로세스 대체가 될 수 있습니다. 따라서, 이미 실행중인 쉘에서, 당신은`행동이 원하지 않는 한 vim` 때 쉘이 할 패치 것이 무슨 소용

exec > >(tee shell.log) 2>&1 
+0

리디렉션을 단순화하는 데 유용 할 수 있지만 'vim'을 실행하려고하면 같은 문제가 발생합니다. 리디렉션을 가능한 한 투명하게 설정하여 리디렉션을 해제해야합니다. – orlade

+0

음, 그렇습니다. 출력이 isatty() 인 경우 vim이 신경 씁니다. 당신은 그것을 고칠 수없고, 그것은 배쉬의 문제가 아닙니다. 'screen'이나'tmux' 등으로 로깅을하십시오. –

+0

...'script'는 똑같은 해커 스크린/tmux/etc를하고 있기 때문에'isatty()'를 유지하면서 로그하는 데 마찬가지로 사용할 수 있습니다. –

관련 문제