내 컴퓨터에서 프로세스를 시작할 때 파일 설명자 6이 열려 있는 것을 볼 수 있습니다. 이 설명자의 목적/용도는 무엇입니까?

내 컴퓨터에서 프로세스를 시작할 때 파일 설명자 6이 열려 있는 것을 볼 수 있습니다. 이 설명자의 목적/용도는 무엇입니까?

오늘 저는 시작 시 파일 설명자의 유효성을 검사하는 도구에서 버그를 발견했습니다. 문제는 추가 연결이 있다는 것입니다 pts.

# In one console I start `cat`
linux $ cat >/tmp/test

# In another console I search for `cat`'s process ID
linux $ ps -ef | grep cat
alexis   34462 25012  0 11:58 pts/17   00:00:00 cat

# Now check the file descriptors:
linux $ ls -l /proc/34462/fd
total 0
lrwx------ 1 alexis alexis 64 Sep 23 11:59 0 -> /dev/pts/17
l-wx------ 1 alexis alexis 64 Sep 23 11:59 1 -> /tmp/test
lrwx------ 1 alexis alexis 64 Sep 23 11:59 2 -> /dev/pts/17
lrwx------ 1 alexis alexis 64 Sep 23 11:59 6 -> /dev/pts/17

보시다시피 은 stdin대상 파일 이름으로 설정됩니다 /tmp/test. 예상대로 0과 2는 pts.

그럼 6은 무엇입니까?

내 생각에는 이것이 내 Rails 환경에서 비롯된 것 같습니다. 스크립트 rvm는 내 콘솔에 몇 가지 "마법"을 수행하고 cd이름이 지정된 파일이 포함된 디렉터리로 이동 하면 Gemfile이를 감지합니다. 즉, 이것은 단지 cd별칭일 뿐이라고 생각합니다... 그러한 파일 설명자를 명령줄에 추가하기 위해 할 수 있는 다른 방법이 있습니까? 그것이 어디서 왔는지, 어떤 기능을 제공하는지 테스트하려면 어떻게 해야 합니까?


. ~/.rvm/scripts/rvm .업데이트: RVM init()를 주석 처리한 후 새 콘솔을 열면 추가 의사 터미널 파일 설명자를 얻지 못하는 것을 확인할 수 있습니다 . 아직도 그들이 어떻게 이런 일을 할 수 있는지 궁금합니다.

답변1

RVM이 시작되면 현재 연결된 표준 오류에 대한 새 파일 설명자를 엽니다. 따라서 RVM 환경에서는 파일 설명자 6이 RVM 로그 출력입니다. 이러한 방식으로 RVM은 표준 오류가 리디렉션되었는지 여부에 관계없이 파일 설명자 6에 출력을 기록하여 동일한 위치에 출력을 기록할 수 있습니다.

파일 설명자가 열려 있습니다.끝에scripts/functions/logging.

exec 6>&2

이것exec내장 기능은 매개변수를 사용하지 않지만 셸 프로세스 내에서 수행되는 리디렉션을 사용합니다. 따라서 exec 6>&2파일 설명자 6을 셸의 파일 설명자 2에 엽니다. 쉘에서 시작된 프로그램은 이 파일 설명자를 상속합니다.

RVM이 무언가를 기록하려고 하면 (보통) 파일 설명자 6으로 출력됩니다. 이런 일이 일어났어rvm_error기능, 예를 들어.

예를 들어, 터미널에서 시작된 RVM 환경에서 실행되는 다음 코드는 "Stuff gone"을 터미널 myfile.log에 기록합니다.Hello

f () {
  echo >&2 "Stuff happened"
  rvm_error "Hello"
}
f 2>myfile.log

답변2

이 특수 파일에는 현재 스레드 futex 컨텍스트 핸들이 포함되어 있습니다.

관련 정보