저는 Bash와 함께 Ubuntu 16.04를 사용하여 확장자가 없고 shebangless 파일을 만들었습니다 /etc/cron.daily/cron_daily
.
for dir in "$drt"/*/; do
if pushd "$dir"; then
wp plugin update --all --allow-root
wp core update --allow-root
wp language core update --allow-root
wp theme update --all --allow-root
popd
fi
done
"$rse"
내가 이렇게 하는 이유 는 혼란 을 줄이기 위해서 입니다 crontab
.
파일 이름이 안전한지, 전체적인 구문과 변수 확장이 정상적인지 여쭤보고 싶습니다.
및 drt
변수는 rse
해당 파일을 가져와 사용할 수 있게 된 후에 내보내집니다.
답변1
내가 액세스할 수 있는 Ubuntu 시스템의 동일한 위치에 있는 다른 스크립트를 살펴보면 이것이 적절한 쉘 스크립트임이 분명합니다. 실행 가능해야 하며 #!
올바른 인터프리터를 가리키는 -라인이 있어야 합니다.
너가 ~ 한 뒤로예상되는변수가 drt
어떤 값으로 설정되어 있다면 실제로 설정되어 있는지 확인하고 합리적인 값으로 설정해야 합니다. 예를 들어, if는 $drt
기존 디렉터리의 경로 이름이어야 합니다.
if [ ! -d "$drt" ]; then
echo 'drt is unset or does not contain path to directory' >&2
exit 1
fi
동일 rse
:
if [ -z "$rse" ]; then
echo 'rse is unset' >&2
exit 1
fi
이 작업은 스크립트 시작 부분에서 수행됩니다.
디렉토리 확인
pushd
주로 popd
대화형 사용을 위한 것입니다(논란의 여지가 있을 수 있음). 또한 디렉토리를 앞뒤로 변경하는 스크립트를 읽고 유지하는 것도 어렵습니다. 이 스크립트에는 없을 수도 있지만 일반적으로 그렇습니다.
작업 디렉토리를 변경하고 뭔가를 한 다음 다시 변경하는 대신 다음 명령을 사용할 수 있습니다.
( cd "some directory" && "some other command" )
위의 내용은 서브쉘 cd
에만 영향을 미칩니다 ( ... )
.
이 스크립트에서는 충분할 수 있습니다.
if cd "$dir"; then
command1
command2
# etc.
fi
이것이 $drt
절대 경로이고 간단한 명령이 시작 위치에 관계없이 올바르게 실행된다고 가정합니다(이것은 - 문 뒤의 수정된 작업 디렉터리 $rse
에 스크립트를 남깁니다 ). if
다른 스크립트가 /etc/cron.daily/
어떻게 작동하는지 확인하세요(위의 제안은 /etc/cron.daily/dpkg
스크립트가 작동하는 방식이지만 - 문 뒤에는 다른 명령이 없습니다 if
).
for
-loop 및 -statement 본문을 적절하게 들여쓰면 스크립트에 이점이 있습니다 if
.
원본 예제 코드를 사용하면 다음과 같이 수행할 수 있습니다.
#!/bin/bash
for dir in "$drt"/*/; do
if pushd "$dir"; then
wp plugin update --all --allow-root
wp core update --allow-root
wp language core update --allow-root
wp theme update --all --allow-root
popd
fi
done
"$rse"
들여쓰기는 공백이나 탭을 사용하여 수행할 수 있습니다(취향에 따라 다름).
또한 이 게시물을 작성하는 동안 변수 이름을 여러 번 잘못 입력했습니다. 설명적인 변수 이름을 갖는 것은 당신 자신(몇 주 후)과 스크립트가 무엇을 해야 하는지 알아내려는 모든 사람에게 도움이 될 것입니다. 스크립트에서 짧은 변수 이름을 사용하면 암호 코드가 발생할 수 있으므로 이점이 없습니다. 또한 이러한 변수가 다른 곳에 설정되어 있다는 사실이 불편합니다. 이는 스크립트에서 알려지지 않고 문서화되지 않은 것에 의존한다는 의미이기 때문입니다.