use*_*970 7 bash cron centos cpanel mv
我在 Bash 中使用 CentOS 共享服务器环境。
ll "$HOME"/public_html/cron_daily/
Run Code Online (Sandbox Code Playgroud)
带来:
./
../
-rwxr-xr-x 1 user group 181 Jul 11 11:32 wp_cli.sh*
Run Code Online (Sandbox Code Playgroud)
我不知道为什么文件名最后有一个星号。我不记得添加它,当我尝试更改它时,我得到了以下输出:
[~/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
Run Code Online (Sandbox Code Playgroud)
此错误可能表明我的 Cpanel cronjob 失败的原因:
更改文件或运行 Cpanel cron 命令时我做错了什么吗?因为这两个操作似乎都失败了。
jes*_*e_b 26
星号实际上不是文件名的一部分。您之所以看到它,是因为该文件是可执行的,并且您的别名ll
包含以下-F
标志:
-F
在作为目录的每个路径名之后立即显示一个斜杠 ('/'),在每个可执行文件之后显示一个星号 ('*'),在每个符号链接之后显示一个 at 符号 ('@'),一个等号 (`=' ) 在每个套接字之后,在每个 whiteout 之后都有一个百分号 ('%'),在每个是 FIFO 之后的竖线 ('|')。
正如 Kusalananda 提到的,你不能像这样使用 cron 将所有脚本放在一个目录中。随着运行的部分,你可以调用"$HOME"/public_html/cron_daily/
如中提到的目录(不只是的.sh)或循环通过他们来执行所有脚本这个帖子。
Jesse_b已经回答了这个问题,但我认为有必要解决一些潜在的误解。
外壳具有在某些特定条件下具有特殊含义的字符。例如:|
用于管道、>
重定向、\
转义字符等。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
则会失败。
考虑以下场景:
$ ls -l
total 0
-rw-rw-r-- 1 user group 0 jul 14 12:00 file*
-rw-rw-r-- 1 user group 0 jul 14 12:00 file1
-rw-rw-r-- 1 user group 0 jul 14 12:00 file2
-rw-rw-r-- 1 user group 0 jul 14 12:00 file3
Run Code Online (Sandbox Code Playgroud)
如果我尝试在file*
不使用引号的情况下重命名:
$ mv file* new_file
mv: target 'new_file' is not a directory
Run Code Online (Sandbox Code Playgroud)
那是因为这些是mv
接收的参数,因此new_file
预计是一个目录:
$ printf '[%s]\n' file* new_file
[file*]
[file1]
[file2]
[file3]
[new_file]
Run Code Online (Sandbox Code Playgroud)
要成功重命名file*
,我需要引用该参数:
$ mv 'file*' new_file
$ ls -l
total 0
-rw-rw-r-- 1 user group 0 jul 14 12:00 file1
-rw-rw-r-- 1 user group 0 jul 14 12:00 file2
-rw-rw-r-- 1 user group 0 jul 14 12:00 file3
-rw-rw-r-- 1 user group 0 jul 14 12:00 new_file
Run Code Online (Sandbox Code Playgroud)