첫 번째 방법

첫 번째 방법

cron 작업을 실행할 수 있도록 스크립트 자체를 복사하고 싶지만 스크립트 내부에서 해당 위치를 가져오는 것이 어렵습니다.posix에서는 신뢰할 수 없음. 더 나은 접근 방식은 전체 스크립트를 구분된 문서로 만들고 가져오는 것입니다.

이를 수행하는 우아한 POSIX 방법이 있습니까?

이 예제 스크립트를 사용하여 지금까지 시도한 작업은 다음과 같습니다.

#!/bin/sh
FOO='hello world'
echo "$FOO"
cat "$0"

첫 번째 방법

/tmp/.script$$필요할 때 스크립트가 적절한 위치에 복사할 수 있도록 작성되었습니다 (busybox는 컴파일을 사용하지 않습니다 mktemp). Linux 2.6에서 실행되며 /dev/fd/또는가 필요하지 /dev/stdin않지만 /proc/self/fd/사용 가능합니다.

#!/bin/sh
trap '{ rm -f "/tmp/.script$$"; exit; }' EXIT INT TERM
tee "/tmp/.script$$" <<'#SCRIPT' | . /proc/self/fd/0
#!/bin/sh
FOO='hello world'
echo "$FOO"
cat "/tmp/.script$$"
#SCRIPT

이는 작동하지만 파이프에서 발생하므로 외부에서 사용할 수 있는 변수나 함수가 없습니다.

두 번째 방법

#!/bin/sh
trap '{ rm -f "/tmp/.script$$"; exit; }' EXIT INT TERM
cat > "/tmp/.script$$" <<'#SCRIPT' && . "/tmp/.script$$"
#!/bin/sh
FOO='hello world'
echo "$FOO"
cat "/tmp/.script$$"
#SCRIPT

여기의 범위는 고정되어 있지만 실행은 스크립트의 성공 여부에 따라 달라집니다.

세 번째 방법

#!/bin/sh
trap '{ rm -f "/tmp/.script$$"; exit; }' EXIT INT TERM
. /proc/self/fd/0 <<EOF
$(tee "/tmp/.script$$" <<': "SCRIPT'
#!/bin/sh
FOO='hello world'
echo "$FOO"
cat "/tmp/.script$$"
: "SCRIPT
)
EOF
#"

기능적으로 이것은 내가 원하는 것이지만 꽤 추악합니다.

작동하지 않는 것

#!/bin/sh
trap '{ rm -f "/tmp/.script$$"; exit; }' EXIT INT TERM
{ ( tee "/tmp/.script$$" >/proc/$$/fd/0 ) <<'#SCRIPT' & } && . /proc/self/fd/0
#!/bin/sh
FOO='hello world'
echo "$FOO"
cat "/tmp/.script$$"
#SCRIPT

이는 대화형 셸처럼 사용자 입력을 기다립니다. stdin이 닫히지 않았기 때문에 이것이 작동하는 이유를 이해하지만 파일에 연결하지 않고 새 파일 설명자를 여는 방법을 잘 모르겠습니다. 어쨌든 파일에 연결하려면 두 번째 방법이 더 깨끗합니다. 일하다).

관련 정보