私は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"
インデントはスペースまたはタブを使用して実行できます(好みによって異なります)。
また、この投稿の作成中に変数名を何度も誤って入力しました。説明的な変数名を持つことは、あなた自身(数週間後)とスクリプトが何をすべきかを知りたい人に役立ちます。スクリプトで短い変数名を使用すると、パスワードコードが発生する可能性があるため、利点はありません。また、これらの変数が他の場所に設定されているという事実も不便です。これは、スクリプトで知られておらず、文書化されていないものに依存するという意味だからです。