2016-10-26 2 views
4

나는 현재의 표준 출력 방향 전환을 얻으려고하고 있고, 약간의 문제가있다.Linux 파일 설명자 - 현재 리디렉션 stdout 파일을 가져 오는 중입니까?

myscript.sh > /tmp/output.log 

는 myscript.sh에서, 나는 그것이로 출력되는 파일 무엇인지 찾아야 :

는 항상 표준 출력 리디렉션 즉 실행되는 스크립트가 있습니다.

나는 (작동하지 않는)이 모델을 시도하고있다 : 예를 들어, 로그 파일 = /tmp/sflq.r3f를 출력하는 것

logfile=$(readlink -f /proc/self/fd/1) 

합니다. 대신에 /tmp/output.log로 가야한다는 것을 알아야합니다.

이것도 가능합니까? 이 중요한 경우

나는 ...

감사 쉘을 콘 사용하고 있습니다!

답변

4

$()은 파이프를 사용합니다 (또는 ksh에 대해 나타나는 것처럼 - ksh가 보통 다른 쉘의 파이프 인 것처럼 에뮬레이트하는 데 사용되는 임시 파일). readlink의 출력을 캡처합니다.

$() 안에 stdout은 파이프 (또는 ksh의 경우 임시 파일)입니다.

당신이 좋아하는 뭔가이 개재 표준 출력 파일 주위에 얻을 수

: 이제

{ logfile=$(readlink -f /proc/self/fd/3); } 3>&1 
# my ksh 93 needs the { ;} -- dash, and zsh don't 
echo "The logfile is: $logfile" 

는 :

./myscript.sh > /tmp/output.log 
echo OUTPUT.LOG 
cat /tmp/output.log 

당신에게 제공해야합니다 :

OUTPUT.LOG 
The logfile is: /tmp/output.log 

또 다른 옵션이다 변수를 피하는 방법을 생각해 보라. 모두 :

echo -n "The logfile is: " 
readlink -f /proc/self/fd/1 #goes straight to stdout so no need to capture 
+0

로그 파일은/proc/18117/fd/3 – John

+0

@ 존 죄송합니다. ksh에서 테스트 했어야합니다. 'ksh'에 대해서는 위와 같이 중괄호에 추가해야합니다. 그러면 그것은 나를 위해 작동합니다 ('ksh version sh (AT & T Research) 93u + 2012-08-01') – PSkocik

+0

그랬습니다! 왜 중괄호가 필요한지 짧은 버전이 있습니까? 아니면 작업을보고 난 후에 시간을 보내야합니까? 감사합니다! – John

0

여러분, 당신은 /proc/*self*/fd에 매우 집착 것으로 보인다. ... 정확히이 자기이 코드 호출의 맥락에서 더 나은 생각되지 않을 것입니다 스크립트의 몸에 /proc/$$/fd 같은 것을 사용하는 경우 평균 무엇을 생각하십니까

(힌트 :. $(readlink …)는 서브 쉘에서 실행)

+0

그게 좋은 지적이고 훨씬 간단한 솔루션을 만들지 만, 그 솔루션의 철자가 더 도움이 될 수 있습니다. (그렇게하지 않으면 민간 전달과 결합하여 다운 투표를하게됩니다.) – mklement0

+0

@ mklement0 다행히도 나는 위쪽 표를 얻으려고 여기에 없다. 어쨌든 대답은'/ proc/$$/fd'입니다. 아마 나는이 사실을 분명히 밝혀 둬야했다. ... – Jubal

+0

나는 그것을 듣게되어 기쁘다. 그러나 나는 당신이 지식을 효과적으로 공유하고 있다고 생각한다. 예, 귀하의 답변에는 모든 관련 정보가 포함되어 있지만 그 정보는 해당 정보를 효과적으로 전달하는 방식으로 전달됩니다. 당신의 대답이 _recognisably_ superior 인 경우, 투표가 득표를하고 시간이 지남에 따라 차선책 ('자기')과 대비되는 것에 초점이 덜 중요해질 것이라고 생각하십시오. – mklement0