2012-02-18 3 views

답변

21

당신은 출력 스트림 tty s 또는하지 않으면 알하기 위해 -t 테스트 스위치를 사용할 수 있어야합니다.

stderr-t 2을 사용하십시오.

+0

내가 원하는대로 작동합니다! 고마워, 많이 – Sigmun

25

기술적으로 stdin/stdout/stderr이 스크립트를 호출하는 내용을 모르기 때문에 "리디렉션"되는지 여부를 알 수있는 방법이 없습니다. 다른 쉘에서 호출하지 않으면 "리디렉션"개념이 없습니다.

당신이해야 할 일은 in/out/err 파일 디스크립터가 (터미널, FIFO, 파이프, 장치, 파일 등) 유형입니다. 일반적으로 출력물이 일부 사용자의 화면으로 이동하는지 또는 다른 프로세스로 이동하는지 여부를 감지하기 만하면됩니다. 이 경우 매트의 대답에 따라 [ -t 1 ]을 사용하십시오.

프로세스가 리디렉션 된 위치와 경로를 확인하려면 심볼릭 링크 /proc/$$/fd/1/proc/$$/fd/2의 대상을 검사하십시오.

누구든지 ./myscript.sh > /dev/pts/1234을 사용하여 프로세스의 출력을 다른 터미널에 연결할 수 있습니다. 그러면 "방향이 바뀌 었"지만 stdout은 여전히 ​​터미널이됩니다.

예 :

$ ls -l /proc/$$/fd/1 > results 
$ bash -c 'ls -l /proc/$$/fd/1 >>results' > /dev/null 
$ bash -c 'ls -l /proc/$$/fd/1 >>results' |cat 
$ bash -c 'ls -l /proc/$$/fd/1 >>results' > /dev/pts/0 
$ cat results 
lrwx------ 1 je4d je4d 64 2012-02-17 21:09 /proc/2463/fd/1 -> /dev/pts/11 
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8302/fd/1 -> /dev/null 
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8304/fd/1 -> pipe:[222798] 
l-wx------ 1 je4d je4d 64 2012-02-18 13:17 /proc/8307/fd/1 -> /dev/pts/0 

[ -t 1 ]

는 사람들의 1, 4 마찬가지 일 것이다.

+2

이것은 배쉬에 대한 이해를 돕는 풍부한 대답이다. 감사 ! – Sigmun

+0

Thx! 명령 줄 테스트를했는데 놀랍지 만 작동하지 않았습니다. 이 명령은 다음과 같습니다 :'(lsof -p $$; ls -l/proc/$$/fd; [-t 1] || echo -n NOT \; echo TERM : $$; ps --forest -s $$;) | cat -'은 fd 1에 대해'/ dev/pts/1'을 출력하지만'NOT TERM'을 출력합니다. 그래서 [tag : bash]는 리다이렉트 ('(...)'가 sub [tag : bash]에서 실행 됨) 알고 있지만 $$는 여전히 부모 [tag : bash]의 PID입니다. – TrueY

+0

그래, 그게 $$이하는 것인데, 서브 쉘은 영향을 미치지 않습니다. 그래서 bash -c '...'를 사용했습니다. – je4d