저의 기본적인 유닉스/리눅스 스크립팅 기술과 서투른 영어를 용서해주세요.
Linux VM에서 스크립트를 테스트하고 있으므로 work.sh
VM에 ssh를 연결해야 합니다.
ssh [email protected]
내 액세스 권한이 있으면 내 홈 폴더에서 스크립트를 실행해야 합니다.
[[email protected] ~]. work.sh param1 param2
배치 스크립트에서 문제가 발생하면 오류가 표시되지만 VM/ssh 세션에서도 쫓겨납니다.
Connection to [email protected] closed.
그래서 다시 로그인을 해야 합니다.
nohup을 시도했지만 오류/로그도 콘솔에 출력하고 싶습니다. 이 상황을 처리하는 더 좋은 방법은 무엇입니까
답변1
set -e
대본에 그런 내용이 있는 것 같네요 . 이 설정이 활성화된 상태에서 소스 스크립트( 를 사용하여 실행 . scriptname
)에서 오류가 발생하면 셸을 닫는 것이 예상되는 동작입니다.
스크립트에 대한 지식이 없으면 스크립트를 실행하지 말아야 한다고 확신할 수는 없지만 .
작업을 수행하는 특이한 방법입니다.
실행해 보겠습니다.
./work.sh param1 param2
스크립트 실행을 방해하는 누락된 실행 비트를 극복하려는 경우 다음을 시도해 볼 수 있습니다.
$SHELL ./work.sh param1 param2
또는 추가 셸을 시작하고 지금처럼 실행할 수 있습니다. 이로 인해 오류 메시지가 나타날 수 있습니다.
$SHELL
. work.sh param1 param2
답변2
내 액세스 권한이 있으면 내 홈 폴더에서 스크립트를 실행해야 합니다.
[[email protected] ~]. work.sh param1 param2
스크립트를 호출하는 방법에는 "일반 호출"과 "포인트 호출" 또는 "구매"의 두 가지 방법이 있습니다.
$ /path/to/executable
$ . /path/to/executable
차이점은 다음과 같습니다. 첫 번째 변형은 운영 체제가 새 프로세스(셸의 하위 프로세스)를 시작하고 그 안에 있는 스크립트를 로드 및 실행하며 로드된 스크립트가 실행을 종료하면 프로세스가 다시 닫힙니다. 당신이 돌아왔습니다. 쉘 프로세스는 아마도 또 다른 프롬프트를 보여줄 것입니다.
두 번째 변형은 유사하게 동작하지만 한 가지 중요한 차이점이 있습니다. 즉, 하위 프로세스가 생성되지 않지만 스크립트는현재 프로세스. 무슨 일이 일어나는지 잘 모르겠지만 work.sh
(댓글을 달고 싶다면 내용을 게시해야 합니다), 어떻게든 로그인 셸을 벗어나서 연결이 끊기는 원인인 것 같습니다. 이전 지점부터 시작하지 마십시오. 그러면 다시 연결이 끊어지는 현상이 발생하지 않을 가능성이 높습니다.
보너스 정보
내 경험에 따르면 초보자는 몇 가지 실험을 통해 무언가가 어떻게 작동하는지 확인할 수 있을 때 가장 잘, 가장 빠르게 학습합니다. 그래서 여기 있습니다:
다음 스크립트를 작성하고 "my_script.sh"로 저장하면 도트 실행과 일반 실행의 차이점을 확인할 수 있습니다.
#!/bin/bash
my_x="abc"
my_y="def"
chmod 754 my_script.sh
실행 가능하게 만들고( ) 일반적인 방법으로 스크립트를 실행한 다음 정의된 두 변수의 내용을 표시하는 것을 잊지 마십시오 .
$ ./my_script.sh
$ echo $my_x $my_y
표시되는 효과는 다음과 같습니다. 없음 - 변수가 설정되지 않았습니다. 이유는 간단합니다. 스크립트 시작 부분에서 다른 프로세스가 시작되고 변수 정의가 발생합니다.거기프로세스가 종료되면 다시 사라집니다.저것환경은 당신 것이 아닙니다.
이제 도트 실행을 사용하여 동일한 스크립트를 실행합니다.
$ . ./my_script.sh
$ echo $my_x $my_y
abc def
이번에는 변수가 실제로 설정되었음을 알 수 있습니다. 그 이유는 스크립트가 일부 새로운 프로세스에서 실행되지 않고 사용자 프로세스에서 실행되기 때문입니다. 따라서 변수 정의는 사용자 환경에서 발생하고 이후에도 그대로 유지됩니다.