내 프로그램을 파일로 리디렉션한다고 가정해 보겠습니다 STDOUT
.STDERR
./script.sh 1> output.log 2> error.log
실행 중인 프로그램이 이를 발견할 수 있습니까? 즉, 이러한 파일의 경로를 알 수 있습니까?
답변1
{ readlink /dev/fd/[1,2] ; echo "out" ; } >./file 2>./error
{ readlink /dev/fd/0 ; cat ; } <./file
산출:
/home/mikeserv/file
/home/mikeserv/file
/home/mikeserv/error
out
{ readlink /proc/$$/fd/[1,2] ; echo out ; } >./file 2>./error
{ readlink /proc/$$/fd/0 ; cat ; } <./file
산출:
/home/mikeserv/file
/home/mikeserv/file
/home/mikeserv/error
out
답변2
전화해도됩니다lsof
쉘 프로세스에서 열린 파일을 나열합니다. -a -p $$
출력을 셸 프로세스( $$
)로 제한하고, -d 1
출력을 파일 설명자 1(예:)로 제한하고, -F n
출력을 구문 분석 가능한 형식으로 인쇄하는 데 사용됩니다 . 다음은 파일 이름의 임의 문자를 처리하는 셸 조각입니다.
output_file=$(lsof -a -p $$ -d 1 -F pn; echo .)
output_file=${output_file%.}
output_file=${output_file#n}
파일 이름에 개행 문자가 포함되어 있지 않으면 output_file=$(lsof -a -p $$ -d 1 -F pn | sed -n '2s/.//p')
.
파일 이름이 항상 존재하는 것은 아니며, 특히 파일이 삭제된 경우에는 더욱 그렇습니다.
Linux에서 파일 이름에 액세스하는 또 다른 방법은 다음을 통해입니다 /proc/$$/fd
. /proc/$$/fd/1
파일 설명자 1의 셸에서 연 파일에 대한 약간 마술적인 기호 링크입니다( readlink
이 링크는 반환된 파일 이름이 존재하지 않는 경우에도 작동합니다(예: 삭제된 파일의 경우)). .
이런 식으로 얻은 정보를 활용하는 것은 일반적으로 매우 나쁜 생각입니다. 누군가가 스크립트를 호출하고 출력을 파일로 리디렉션하는 경우 파일 위치에 따라 다르게 동작하거나 파일에 추가하는 것 이외의 방식으로 파일에 영향을 준다면 그들은 그것을 좋아하지 않을 것입니다. 한 가지 예외가 있습니다. 터미널에 쓰는지 아니면 터미널에 색상이나 진행률 표시기를 표시하는 등 다른 것(파이프, 소켓, 파일)에 쓰는지 여부에 따라 다르게 반응해야 할 수도 있습니다. 파일 설명자가 터미널에 연결되어 있는지 확인하는 특정 테스트가 있습니다.
if [ -t 2 ]; then
# stderr is a terminal
printf 1>&2 '\e[31mError: widget not found\e[0m'
else
# stderr is not a terminal
echo 1>&2 'Error: widget not found'
fi
답변3
귀하의 경우에는 STDOUT
파일에 저장 output.log
하고 STDERR
파일에 저장하십시오 error.log
. 두 파일 모두 동일한 디렉토리에 저장됩니다 script.sh
.
프로그램이 이러한 파일에 대한 "경로를 알도록" 하려면 절대 경로를 사용해야 합니다.
./script.sh > /path/to/output.log 2> /path/to/error.log
답변4
output.log
파일은 error.log
현재 디렉터리(즉, 변수 값)에 생성됩니다 $PWD
. 프로그램이 나중에 이러한 파일을 사용하도록 하려면 스크립트를 실행하기 전에 해당 디렉터리를 변수에 저장하면 됩니다. 예는 다음과 같습니다.
OUTDIR=$PWD
./script.sh 1> output.log 2> error.log
# Whatever you want to do else ...
echo The output file : =======
cat $OUTDIR/output.log
echo =========================
echo
echo The errors file : =======
cat $OUTDIR/error.log
echo =========================