SERVER:~ # fuser -uc /var/log
/var/log: 6824(daemon) 9902(root) 14011(root) 14084(root) 14208(lp)
SERVER:~ # fuser -uc /var/log 2>/dev/null
6824 9902 14011 14084 14208SERVER:~ #
SERVER:~ #
질문:역사적 이유인가 아니면 기술적인 이유인가?
답변1
이 fuser
유틸리티에는 다음 표준이 적용됩니다.
이에 대한 근거는 진단 정보를 에 출력하는 것입니다 stderr
. 여기에는 오류뿐만 아니라 유틸리티의 기본 데이터 출력이 아닌 모든 항목이 포함됩니다. 이는 유용한 데이터이지만,
포함된 경우 stdout
출력을 구문 분석하는 것이 점점 더 어려워집니다 .
리디렉션되거나 필터링된 경우 stdout
stderr는 계속해서 터미널에 인쇄합니다.
~에 따르면IEEE 표준 1003.1, 2004년판, fuser
유틸리티:
The *fuser* utility shall write to standard error additional information about the
named files indicating how the file is being used.
표준 오류 오류율
이것퓨저유틸리티는 표준 오류에 진단 메시지를 기록해야 합니다. 이것퓨저또한 유틸리티는 표준 오류에 다음을 기록해야 합니다.
명명된 각 파일의 경로 이름 뒤에는 콜론이 옵니다.
표준 출력에 기록하는 각 프로세스 ID에 대해 프로세스가 파일을 현재 디렉터리로 사용하는 경우 문자 "c"를 표준 오류에 기록해야 하고, 프로세스가 파일을 사용하는 경우 표준 오류에 문자 "r"을 기록해야 합니다. file.standard 오류를 루트 디렉터리로 사용합니다. 구현에서는 파일의 다른 용도를 나타내기 위해 다른 알파벳 문자를 쓸 수 있습니다.
언제. . . 언제-유옵션을 지정할 때 파일의 목적을 나타내는 문자 바로 뒤에는 프로세스의 실제 사용자 ID에 해당하는 사용자 이름(괄호 안)이 와야 합니다. 프로세스의 실제 사용자 ID에서 사용자 이름을 확인할 수 없는 경우 사용자 이름 대신 프로세스의 실제 사용자 ID를 작성해야 합니다.
표준 출력과 표준 오류가 동일한 파일로 전달되는 경우 파일 이름이 각 줄의 시작 부분에 나타나고 그 뒤에 프로세스 ID와 파일의 목적을 나타내는 문자가 나타나도록 출력이 인터리브되어야 합니다. 그래서 만약-유옵션을 지정한 경우 해당 파일을 사용하는 각 프로세스의 사용자 이름이나 사용자 ID를 적어야 합니다.
각 파일 피연산자에 대해 A는
<newline>
위의 마지막 출력 이후 표준 오류에 기록되어야 합니다.
인용하다
답변2
이는 의도적인 것입니다.
fuser
프로세스 ID와 그 사이의 공백 구분 기호만 포함하는 "원시" 형식으로 stdout으로 출력합니다. 이 형식의 목적은 다른 프로세스로의 파이프 연결이나 기타 작업 sed
등을 용이하게 하는 것입니다. 무엇보다도 사람이 소비할 추가 정보를 stderr로 출력하고 stdout 출력과 인터리브하고 동기화합니다. 여기에는 프로세스의 파일 사용 유형 및 기타 정보가 포함됩니다. 아이디어는 이 "추가" 정보를 파이프로 보내는 대상으로 보낼 필요가 없으며 fuser
이를 stderr로 보내면 기본적으로 그런 일이 발생한다는 것입니다.