스크립트에서 시간 초과로 호출할 때 시계가 화면에 아무것도 표시되지 않는 이유는 무엇입니까?

스크립트에서 시간 초과로 호출할 때 시계가 화면에 아무것도 표시되지 않는 이유는 무엇입니까?

이 스크립트를 실행하면확실히watch화면에 출력을 표시하고확실히5초 후에 시간 초과가 발생합니다.

§ cat script.sh
#!/bin/bash
timeout 5s watch -n 1 ps

스크립트를 실행할 때 화면에 표시되는 내용은 다음과 같습니다.

여기에 이미지 설명을 입력하세요.

그러나 터미널에서 직접 스크립트를 실행하면 예상대로 작동합니다.

§ timeout 5s watch -n 1 ps

스크립트에서 호출하면 watch콘텐츠가 화면에 표시되지 않게 되는 정확히 어떤 일이 발생합니까?

또한 스크립트에서 옵션을 사용하면 --foreground예상대로 작동하는데 왜 그런지 모르겠습니다.timeout

중요한 경우 이러한 도구의 버전은 다음과 같습니다.

§ bash --version
bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)
Copyright (C) 2007 Free Software Foundation, Inc.

§ watch -v
watch from procps-ng 3.3.12-dirty

§ timeout --version
timeout (GNU coreutils) 8.29
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Padraig Brady.

답변1

timeout쉘 스크립트에서 실행하면 동작이 다릅니다. 이 --foreground옵션은 스크립트에서 실행하는 경우에도 기본 "대화형" 동작을 강제합니다. 맨페이지에서:

--foreground

    when not running timeout directly from a shell prompt, allow COMMAND to
    read from the TTY and get TTY signals; in this mode, children of
    COMMAND will not be timed out

그리고 watch모든 멋진 ANSI 트릭을 수행하려면 터미널에 쓰기가 필요합니다.

실제로 작동하는 모습을 보려면 다음을 시도해 보세요.

$ script -c 'timeout --foreground 5s watch -n 1 ps'
$ less typescript

관련 정보