쉘 파이프라인의 명령이 해당 컨텍스트의 tty 특성을 결정할 수 있습니까?

쉘 파이프라인의 명령이 해당 컨텍스트의 tty 특성을 결정할 수 있습니까?

항목 목록을 나열하는 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입니다.
  • 스크립트가 파이프라인 시작 부분에서 실행되고 stdinTTY stderr인 경우
  • 스크립트가 파이프라인 중간에 실행되는 경우 stderrTTY
  • 스크립트가 파이프 끝에서 실행되고 stdoutTTY stderr인 경우

그것은 모두 논리적인 것 같습니다. stderr파이프도 리디렉션되면 분명히 동작이 달라집니다.

귀하의 질문에 완전히 대답하기 위해 모든 경우에 터미널 특성을 결정하는 것이 가능하다고 생각하지 않지만 실행할 /dev/fd수 있는 TTY인 FD(모든 항목 확인)를 찾을 수 있다면 stty... 하지만 파이프의 중앙에서 파이프 끝의 방향을 결정하는 것은 불가능합니다.

말한 바와 같이재니스, 파이프에 관계없이 제어 터미널에 대한 정보를 알고 싶다면 /dev/tty,예를 들어stty -F /dev/tty; 그러나 제어 터미널 없이 스크립트를 실행하면 실패합니다.예를 들어직장 에서 cron.

관련 정보