heredocument에서 nohup을 수행하는 방법은 무엇입니까?

heredocument에서 nohup을 수행하는 방법은 무엇입니까?

다음과 같은 시간 초과 코드 블록이 있습니다.

#!/bin/bash

WB=$1
sleep 2h;
commands...
kill $WB

nohup스크립트를 사용하고 실행하려면배경, 파일에 붙여넣은 후 다음을 실행할 수 있습니다.

nohup /opt/myscript.sh $$ &

내 목표는 다음을 달성하는 것입니다.

이것을 파일에 붙여넣고 실행하는 대신 heredoc에서 직접 실행하고 싶습니다.

/dev/fd/10 10<< 'EOF0'
#!/bin/bash

WB=$1
sleep 2h;
commands...
kill $WB
EOF0

heredocs는 전체 코드 블록을 Bash에 직접 붙여넣은 다음 실행하는 유일한 방법이기 때문에 heredocs를 사용합니다. 제 경우에는 훌륭하게 작동합니다.

내 질문:

위의 hereodc를 어떻게 올바르게 nohup사용할 수 있습니까 ?&

위의 heredoc은 특별한 heredoc이며 외부 heredoc(EOF0)이므로 1개 이상의 heredoc(EOF1, EOF2...)가 포함될 수 있습니다.

답변1

제가 이해한 바에 따르면, 스크립트의 전체 내용을 복사하여 구분된 문서로 붙여넣어 실행하고 싶은 것 같습니다. 이렇게 할 수 있지만 문제가 있습니다. Heredoc에 나타날 위치 매개변수 $1에 값을 어떻게 할당합니까? 여기서의 비결은 해당 매개변수를 --기호 뒤에 넣어 bash에 전달하는 것입니다(bash 자체에 전달된 매개변수와 스크립트에 전달된 매개변수를 분리합니다). Bash는 물론 표준 입력에서 명령을 읽어야 하므로 -s이 플래그를 지정해야 합니다.

이 예제의 코드가 작동하는지 확인하려면 새 의사 터미널을 열고 다음을 입력하세요(참고: 첫 번째 근처의 따옴표는 필수이며 EOF0heredoc 자체 내부의 확장을 방지합니다).$1

nohup bash -s -- $$ <<'EOF0' &
#!/bin/bash

WB=$1
sleep 2h;
commands...
kill $WB
EOF0

하지만 EOF0 자체에는 특별한 의미가 없다는 점을 말씀드리고 싶습니다. 원하는 문자열을 구분 기호로 사용할 수 있습니다(예: 'EOF'또는 'HEREDOC_DELIMITER'). 중요한 점은 기호 근처에 작은따옴표가 있다는 것입니다 <<. 이렇게 하면 heredoc 내부에서 확장이 방지되므로 스크립트 매개변수( $1게시된 코드에서 사용할 수 있는 것과 마찬가지로 ) 다른 heredoc을 중첩하세요.

답변2

코드를 사용하세요:

nohup bash <<EOF &
WB=$1
sleep 2h;
commands...
kill \$WB
EOF

코드를 읽을 $1때 확장된다는 점에 유의하세요. $WB코드를 실행할 때 확장 하려면 $인용문이 필요합니다.

관련 정보