항목 목록을 나열하는 bash 스크립트가 있습니다. 기본적으로 보고된 터미널 너비를 기반으로 출력할 열 수를 추측합니다 stty size
. 그러나 스크립트가 파이프라인에 있는 경우 stty
"장치에 부적절한 ioctl"이 보고됩니다.
내가 원하는 것은 내 스크립트가 파이프 중간에서 명령으로 실행될 때 그것이 속한 파이프가 결국 tty로 출력되는지 여부를 발견하고, 만약 그렇다면 그 특성을 stty할 수 있도록 허용하는 것입니다.
해결 방법: 아래에 설명된 대로 stty -F /dev/tty
파이프라인의 어느 곳에서나 작동하는 것 같습니다.
답변1
다음과 같은 스크립트를 사용하여 시도해 볼 수 있습니다.
#!/bin/sh
for fd in 0 1 2; do
if [ -t $fd ]; then echo $fd is a TTY; fi
done
이것을 실행하면 다음과 같습니다.
- 스크립트가 개별적으로 실행되는 경우 세 FD는 모두 TTY입니다.
- 스크립트가 파이프라인 시작 부분에서 실행되고
stdin
TTYstderr
인 경우 - 스크립트가 파이프라인 중간에 실행되는 경우
stderr
TTY - 스크립트가 파이프 끝에서 실행되고
stdout
TTYstderr
인 경우
그것은 모두 논리적인 것 같습니다. stderr
파이프도 리디렉션되면 분명히 동작이 달라집니다.
귀하의 질문에 완전히 대답하기 위해 모든 경우에 터미널 특성을 결정하는 것이 가능하다고 생각하지 않지만 실행할 /dev/fd
수 있는 TTY인 FD(모든 항목 확인)를 찾을 수 있다면 stty
... 하지만 파이프의 중앙에서 파이프 끝의 방향을 결정하는 것은 불가능합니다.
말한 바와 같이재니스, 파이프에 관계없이 제어 터미널에 대한 정보를 알고 싶다면 /dev/tty
,예를 들어및 stty -F /dev/tty
; 그러나 제어 터미널 없이 스크립트를 실행하면 실패합니다.예를 들어직장 에서 cron
.