나는 이것이 전적으로 bash 문제 라고 생각하지 않습니다 .
코멘트에서, 당신은 당신이 한 후에이 오류를 보았다고 말했다
sudo su username2
로 로그인 할 때 username
. 그것이 su
문제를 일으키는 것입니다.
/dev/stdout
심볼릭 링크이다 /proc/self/fd/1
예 심볼릭 링크이다, /dev/pts/1
. /dev/pts/1
의사 터미널 인,는 소유하고 쓰기 가능합니다 username
. username
로그인 하면 소유권이 부여됩니다 .의 sudo su username2
경우 소유권이 /dev/pts/1
변경 username2
되지 않으며 쓰기 권한이 없습니다.
나는 이것이 버그라고 주장한다. 사실상 표준 출력 스트림의 별칭 /dev/stdout
이어야 하지만 여기서는 echo hello
작동하지만 echo hello > /dev/stdout
실패 하는 상황을 볼 수 있습니다 .
한 가지 해결 방법은 username2
group의 멤버 를 만드는 tty
것이지만 tty username2
에 쓸 수 있는 권한을 부여하므로 바람직하지 않습니다.
다른 해결 방법은을 username2
사용하지 않고 계정 에 로그인 하여을 소유 한 새로 할당 된 유사 터미널 su
을 /dev/stdout
가리 킵니다 username2
. 실용적이지 않을 수 있습니다.
또 다른 해결 방법은 스크립트가 /dev/stdout
및을 참조하지 않도록 수정하는 것입니다 /dev/stderr
. 예를 들어 다음을 바꾸십시오.
echo OUT > /dev/stdout
echo ERR > /dev/stderr
이로 인해:
echo OUT
echo ERR 1>&2
나는 bash는 4.2.24로, 내 자신의 시스템, 우분투 12.04에서이 참조 - bash는 문서 (비록 info bash
내 시스템)를 말한다 /dev/stdout
및 /dev/stderr
리디렉션에 사용할 때 특별히 처리됩니다. 그러나 bash가 해당 이름을 특수하게 처리하지 않더라도 표준 I / O 스트림과 동등한 역할을 수행해야합니다. (POSIX는 언급하지 않으므로 /dev/std{in,out,err}
이것이 버그라고 주장하기 어려울 수 있습니다.)
이전 버전의 bash를 살펴보면 문서 /dev/stdout
는 파일의 존재 여부에 상관없이 특별히 처리 된다는 것을 암시합니다 . 이 기능은 bash 2.04에서 도입되었으며 NEWS
해당 버전 의 파일은 다음과 같습니다.
리디렉션 코드는 이제 파일 시스템에 있는지 여부에 관계없이 / dev / fd / N, / dev / stdin, / dev / stdout 및 / dev / stderr과 같은 여러 파일 이름을 처리합니다.
그러나 소스 코드 ( redir.c
) 를 살펴보면 심볼 이 정의 된 경우 에만 특수 처리가 가능하다는 것을 알 수 있습니다 HAVE_DEV_STDIN
(이것은 소스에서 bash가 빌드 될 때 결정됨).
내가 알 수있는 한, bash의 릴리스 버전은 일부 배포판이 패치하지 않은 한 기타 조건을 특수하게 처리 하지 않았습니다/dev/stdout
.
따라서 시도하지 않은 또 다른 해결 방법은 bash 소스 를 가져 와서 redir.c
특수 /dev/*
처리를 무조건으로 수정 하고 시스템과 함께 제공된 버전이 아닌 재구성 된 버전을 사용하는 것입니다. 그러나 이것은 아마도 과잉 일 것입니다.
요약 :
당신의 OS는 광산처럼, 소유권 및 권한 처리되지 /dev/stdout
및 /dev/stderr
제대로을. bash는 가정으로 재 지정에 특별히 이러한 이름을 취급하지만, 사실 그것은 파일이 존재하지 않는 경우에만 수정한다. 경우에 그것은 문제가되지 것 /dev/stdout
하고는 /dev/stderr
제대로 작동했다. 이 문제는 su
다른 계정으로 이동하거나 비슷한 작업을 수행 할 때만 나타납니다 . 단순히 계정에 로그인하면 권한이 올바른 것입니다.
ls -l /dev/stdout /dev/stderr
과 의 출력은 무엇입니까ls -lL /dev/stdout /dev/stderr
?