Bash 파일 내의 Bash "스크립트" 명령이요?

Bash 파일 내의 Bash "스크립트" 명령이요?

bash 스크립트 /usr/bin/local/myscript가 있습니다. 나는 일반적으로 외부 소프트웨어(내 경우에는 Autohotkey)에서 파일을 실행하는데, 기본적으로 스크립트가 즉시 완료되고 창이 닫혀서 창, 정보 로그 또는 오류 로그에 대한 로그를 볼 수 없다는 의미입니다. 그래서 나는 프로그램이 제대로 작동하지 않을 때 디버깅을 위해 전체 실행 단계를 "스크립팅"하는 것을 좋아합니다. 그러나 단순히 파일 script ~/script.txt의 첫 번째 줄에 넣는 것은 myscript작동하지 않았습니다. 무슨 일이 일어나고 있는지 모르겠습니다. 파일의 다음 줄은 기본적으로 실행되지 않았습니다. 그렇다면 bash 파일에서 "스크립트"를 사용하는 (적절한) 방법이 있습니까, 아니면 "스크립트"에 대한 더 나은 대안이 있습니까?

답변1

script ~/script.txt그러나 단순히 파일 의 첫 번째 줄에 넣는 것은 myscript작동하지 않았습니다. 무슨 일이 일어나고 있는지 모르겠습니다. 파일의 다음 줄은 기본적으로 실행되지 않았습니다.

쉘 해석의 경우 myscript외부 script ~/script.txt실행 파일을 실행하는 명령일 뿐입니다. script이 경우 실행 파일이 있습니다 .

실행 파일이 또는 인 경우 sleep나머지 tar부분 ls을 해석하기 전에 실행 파일이 완료될 때까지 쉘이 기다릴 것으로 예상할 수 있습니다 myscript. 다르지 않습니다 script. 쉘은 script완료될 때까지 기다립니다.

script대화형으로 사용하기 위한 것입니다. script ~/script.txt를 해석하는 쉘이 아닌 대화형 쉘을 실행합니다 myscript. "창이 닫힙니다"(가 없는 경우 script)라고 썼으므로 myscript창을 표시하는 일부 터미널 에뮬레이터에서 실행된다고 가정합니다. 그렇다면 (를 사용하여 script) 아마도 이 내부 쉘이 시작된 것을 보았고 script외부 쉘이 기다리는 동안 그것과 상호 작용할 수 있었을 것입니다. script내부 쉘에서 수행하는 작업을 기록합니다. 내부 쉘 종료가 종료 script되고 나서야 외부 쉘(즉 myscript)이 계속됩니다. 하지만 터미널 에뮬레이터를 닫았을 수도 있고 외부 쉘에 SIGHUP이 발생하여 계속되지 않았을 수도 있습니다.

외부 셸이 계속되더라도 script내부에서 호출하면 myscript디버깅에 도움이 되지 않는다는 것이 이제 명확해졌기 때문에 이는 중요하지 않습니다 .myscript

디버깅하는 방법에는 최소한 두 가지가 있습니다 myscript.

  1. 스크립트의 stderr을 로그 파일로 리디렉션합니다. 이는 스크립트 내에서 다음을 사용하여 수행할 수 있습니다.

    # just after shebang
    exec 2>/path/to/logfile
    

    myscript중요한 stdout에서 출력을 생성하고 실제로 어딘가(파이프나 리디렉션을 통해)로 이동하는 경우 이를 중단하고 싶지 않습니다. 그러나 일반적으로 터미널에 인쇄되고 이를 기록하려는 경우 stderr 및 stdout을 모두 로그 파일로 리디렉션합니다.

    # just after shebang
    exec 2>/path/to/logfile 1>&2
    

    myscript이 방법은 터미널 없이 실행되는 경우에도 작동합니다 .

  2. 또는 스크립트가 bash맨 마지막에 대화형 셸(예: )을 실행하도록 하세요. 새 셸은 창이 닫히는 것을 방지하며 지금까지 스크립트가 터미널에 인쇄한 내용을 볼 수 있습니다. 분명히 터미널이 필요합니다. 또는 자체 또는 다른 실행 파일 myscript에 발생하는 경우에는 ; 그것을 고려하십시오.exitkillexecbash

    어떤 이유로 bash스크립트에서 시작된 대화형이 터미널 등을 지우는 경우 sleep 3600대신 사용하십시오. 요점은 실제로 추가 셸이 필요하지 않다는 것입니다. 이전 출력을 검사할 수 있도록 터미널 에뮬레이터를 충분히 오랫동안 열어 두는 프로세스가 필요하다는 것입니다.

어떤 방법을 선택하든 장소에

set -x

myscript이를 해석하는 쉘이 실행될 때 명령과 인수를 인쇄하도록 초기에 설정했습니다. 이를 통해 유용한 통찰력을 얻을 수 있습니다.

관련 정보