我使用带有 Bash 的 CentOS 共享服务器环境。
ll "$HOME"/public_html/cron_daily/
带来:
./
../
-rwxr-xr-x 1 user group 181 Jul 11 11:32 wp_cli.sh*
我不知道为什么文件名最后有一个星号。我不记得添加它,当我尝试更改它时,我得到了这个输出:
[~/public_html]# mv cron_daily/wp_cli.sh* cron_daily/wp_cli.sh
+ mv cron_daily/wp_cli.sh cron_daily/wp_cli.sh
mv: `cron_daily/wp_cli.sh' and `cron_daily/wp_cli.sh' are the same file
此错误可能表明我的 Cpanel cronjob 失败的原因:
更改文件或运行 Cpanel cron 命令时我做错了什么吗?因为这两个操作似乎都失败了。
星号实际上不是文件名的一部分。您看到它是因为该文件是可执行的,并且您的别名
ll
包含-F
标志:正如 Kusalananda 所提到的,您不能像这样使用 cron 将目录中的所有脚本都全局化。使用 run-parts,您可以调用
"$HOME"/public_html/cron_daily/
以执行目录中的所有脚本(不仅仅是 .sh)或循环通过它们,如本文所述。Jesse_b已经回答了这个问题,但我认为有必要解决一些潜在的误解。
shell 具有在某些特定条件下具有特殊含义的字符。例如:
|
用于管道、>
重定向、\
转义字符等。这些字符不会被 shell 逐字解释,所以这就是为什么当你这样做时echo foo>bar
,foo>bar
不会打印到终端,而是foo
重定向到bar
文件.幸运的是,shell 还有一种机制可以使这些字符失去其特殊含义:引用。在 POSIX shell 中,有 3 种引用机制:
\
:保留以下字符的文字值,但 a 除外<newline>
。"..."
:保留双引号内所有字符的文字值,除了字符`
,$
和\
.'...'
:保留单引号内每个字符的文字值,没有例外。因此,按照前面的示例,如果我们想按
foo>bar
字面意思打印,我们可以这样做:echo foo\>bar
echo "foo>bar"
echo 'foo>bar'
星号
*
是这些特殊字符之一,它是模式匹配符号的一部分,用于文件名扩展。换句话说,诸如此类的命令echo *.txt
将用模式匹配的文件替换模式。在你的情况下,
cron_daily/wp_cli.sh*
只有匹配cron_daily/wp_cli.sh
,所以mv
看到 2 个相同的参数并抱怨它。没关系,因为没有cron_daily/wp_cli.sh*
文件。但是,如果您有一个实际cron_daily/wp_cli.sh*
文件和更多可以与该模式匹配的文件,mv
则会失败。考虑以下场景:
如果我尝试重命名
file*
而不使用引号:这是因为这些是
mv
接收的参数,因此new_file
应该是一个目录:要成功地重命名
file*
,我需要引用该论点: