이 스크립트를 실행하면확실히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