watch 명령의 ls 형식 지정

watch 명령의 ls 형식 지정

이 작업을 수행하면 ls /dev/tty*다음과 같은 출력이 표시됩니다.

/dev/tty    /dev/tty12  /dev/tty17  /dev/tty21  /dev/tty26  /dev/tty30  /dev/tty35  /dev/tty4   /dev/tty44  /dev/tty49  /dev/tty53  /dev/tty58  /dev/tty62  /dev/ttyS0
/dev/tty0   /dev/tty13  /dev/tty18  /dev/tty22  /dev/tty27  /dev/tty31  /dev/tty36  /dev/tty40  /dev/tty45  /dev/tty5   /dev/tty54  /dev/tty59  /dev/tty63  /dev/ttyS1
/dev/tty1   /dev/tty14  /dev/tty19  /dev/tty23  /dev/tty28  /dev/tty32  /dev/tty37  /dev/tty41  /dev/tty46  /dev/tty50  /dev/tty55  /dev/tty6   /dev/tty7   /dev/ttyS2
/dev/tty10  /dev/tty15  /dev/tty2   /dev/tty24  /dev/tty29  /dev/tty33  /dev/tty38  /dev/tty42  /dev/tty47  /dev/tty51  /dev/tty56  /dev/tty60  /dev/tty8   /dev/ttyS3
/dev/tty11  /dev/tty16  /dev/tty20  /dev/tty25  /dev/tty3   /dev/tty34  /dev/tty39  /dev/tty43  /dev/tty48  /dev/tty52  /dev/tty57  /dev/tty61  /dev/tty9

형식이 양호하며 터미널 내에서 모든 파일을 적당한 크기로 볼 수 있습니다.
하지만 이런 식으로 명령을 실행하면 다음과 같이 watch -d -n1 'ls /dev/tty*'표시됩니다.

Every 1.0s: ls /dev/tty*                                                                                                                                                        debian: Wed Jun 30 21:08:06 2021

/dev/tty
/dev/tty0
/dev/tty1
/dev/tty10
/dev/tty11
/dev/tty12
/dev/tty13
/dev/tty14
/dev/tty15
/dev/tty16
/dev/tty17
/dev/tty18
/dev/tty19
/dev/tty2
/dev/tty20
/dev/tty21
...

따라서 출력이 세로로 나열되어 화면에 맞지 않습니다. 이유는 무엇입니까? 이 문제를 어떻게 해결할 수 있나요?

답변1

이유는 무엇입니까?

명령을 실행할 때 watch터미널에 연결되지 않습니다. 즉, isatty(3)0이 반환됩니다. 다음 isatty.c를 사용하여 명령이 실행될 때 터미널에 연결되어 있는지 확인할 수 있습니다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
  printf("%d\n", isatty(STDOUT_FILENO));

  return EXIT_SUCCESS;
}

엮다:

gcc isatty.c -o isatty

터미널 에뮬레이터에서 실행:

$ ./isatty
1

시계에서 실행:

$ watch ./isatty
Every 2.0s: ./isatty                                                                                                                                                              darkstar: Wed Jun 30 20:42:51 2021

0

이 문제를 어떻게 해결할 수 있나요?

watch 와 함께 ls 옵션을 사용하십시오 -C.

watch -d -n1 'ls -C /dev/tty*'

답변2

ls위에 제공된 답변은 TTY가 감지될 때와 동일한 작업을 수행하는 옵션을 제공하므로 좋습니다 . 그러나 다른 명령에서 이 작업을 수행하려는 경우(해당 옵션은 없음) 간단한 방법은 다음과 같습니다.

$ watch 'unbuffer ls /dev/tty*'

unbuffer[1] 기본적으로 tty를 생성하고 이를 사용하여 그렇지 않으면 진행되는 버퍼링을 중지합니다. 부작용은 실행되는 프로그램(이 경우 ls)이 TTY를 확인하므로 터미널에 표시되는 것과 정확히 동일한 작업을 수행한다는 것입니다.

[1]https://linux.die.net/man/1/unbuffer

관련 정보