오늘 저는 시작 시 파일 설명자의 유효성을 검사하는 도구에서 버그를 발견했습니다. 문제는 추가 연결이 있다는 것입니다 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 컨텍스트 핸들이 포함되어 있습니다.