/etc/cron/ 的基本用法 (d):/etc/cron 的正确模式(每日/每周/每月)

/etc/cron/ 的基本用法 (d):/etc/cron 的正确模式(每日/每周/每月)

我将 Ubuntu 16.04 与 Bash 结合使用,并创建了这个无扩展名、无 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 计算机上同一位置的其他脚本,很明显这些脚本应该是正确的 shell 脚本。它们应该是可执行的,并且有一个#!指向正确解释器的 -line 。

自从你预计如果变量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仅影响( ... )子shell。

在这个脚本中,可能就足够了

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"

缩进可以使用空格或制表符来完成(这是一个品味问题)。

此外,我在写这篇文章时多次输错了你的变量名。拥有描述性变量名称对您自己(几周后)和任何试图弄清楚您的脚本应该做什么的人都有好处。在脚本中使用短变量名没有任何好处,因为它会导致代码晦涩难懂。此外,我对这些变量在其他地方设置这一事实感到不安,因为这意味着依赖于脚本中未知且未记录的内容。

相关内容