저는 일반적으로 자동화된 프로세스(예: cron, Jenkins)로 실행되는 스크립트의 동작을 연구하고 있습니다. 대화형으로 실행될 때 스크립트는 (결국) 다르게 동작하는 명령을 호출할 수 있습니다(예를 들어, patch
역방향 패치로 무엇을 해야 하는지 묻고 svn
비밀번호를 묻습니다. 그러나 다음과 같은 경우 어떤 일이 발생하는지 확인해야 합니다. 비대화형으로 실행됩니다.
patch
비대화형으로 설득하는 것은 상당히 쉬웠습니다. 단지 stdout
비-tty로 리디렉션하면 되었습니다.
$ </dev/null > >(cat) /path/to/myscript --args
그러나 svn
존재하는 경우 제어 터미널에 연결합니다. 전달할 스크립트를 편집하는 --non-interactive
것은 여러 수준에서 이루어지고 각 호출을 찾았는지 알기 어렵기 때문에 실제로는 옵션이 아닙니다.
제어 터미널 없이 스크립트/명령을 비대화식으로 호출하는 방법이 있습니까(그래서 /dev/tty
존재하지 않습니까)? 나는 stdout/stderr이 여전히 내 터미널로 가는 것을 선호합니다.
(이 질문을 찾았습니다.비대화형 쉘에서 스크립트를 실행하시겠습니까?그러나 대답은 cron과 사용자 환경의 차이점에 대해 설명합니다. 상호 작용을 제외한 모든 차이점을 제거했습니다. )
답변1
터미널에 연결되지 않은 다른 세션을 시작해야 합니다. 예를 들면 다음과 같습니다.
$ setsid sh -c 'tty; ps -jp "$$"; echo test' < /dev/null > log 2>&1
$ cat log
not a tty
PID PGID SID TTY TIME CMD
19506 19506 19506 ? 00:00:00 sh
test
start-stop-daemon
일부 Linux 배포판의 명령 도 참조하세요 . 아직 하나 있어요daemon
주문하다.
답변2
Expect 스크립트를 실행하고 싶을 수도 있습니다. SVN 예:
https://stackoverflow.com/questions/609445/using-expect-to-login-into-svn
답변3
때로는 표준 입력을 열어 두어야 합니다(표준 입력에서 eof를 수신하지 않음)(예: 기대). 이 경우 /dev/null을 /dev/zero로 변경합니다.
setsid sh -c 'make test' </dev/zero >log 2>&1