我正在查看crontab文件并找到以下条目:
30 05 * * * /bin/zsh -ls % MyScript.sh myConfigFile.ini
此条目显然会在MyScript.sh
中以myConfigFile.ini
作为参数执行zsh
,但此处-ls %
的含义是什么。
答案 0 :(得分:1)
实际上,尽管它确实执行MyScript.sh myConfigFile.ini
,但它并不像它看起来那么明显。
-ls
是-l -s
的简写。这些参数启用了 zsh
-l
启用选项LOGIN
,该选项告诉 zsh 它是一个登录shell。这也意味着在初始化时会读取~/.zprofile
结束/etc/zprofile
(或某些系统上的/etc/zsh/zprofile
,并在退出时读取~/.zlogout
和/etc/zlogout
。-s
启用选项SHIN_STDIN
。这告诉 zsh 从 STDIN 读取命令,如果没有使用-c COMMAND
指定命令且未指定脚本,这也是默认命令。显式设置-s
也会禁用从命令行获取脚本。通常被视为文件的任何参数都被视为普通的位置参数(也就是说,在已启动的shell会话中,它们将在数组$@
和$*
以及标量参数中可用{ {1}},$1
)。通常$2
会启动 zsh 登录shell,参数zsh -ls % MyScript.sh myConfigFile.ini
,$1
和$2
设置为$3
,分别为%
和MyScript.sh
。 不运行myConfigFile.ini
并等待来自 STDIN 的输入。
但是这是在crontab中。除非使用MyScript.sh
进行转义,否则命令中的%
具有特殊含义。第一个\
之后的所有内容都将作为标准输入发送到命令。任何进一步的%
都将被换行符替换。
结合使用%
(或其替身)运行此crontab条目
cron
它作为登录shell启动30 05 * * * /bin/zsh -ls % MyScript.sh myConfigFile.ini
,它将等待 STDIN 上的输入。 zsh
然后将cron
作为 STDIN 发送到shell。
为什么这样做(而不仅仅是MyScript.sh myConfigFile.ini
或者MyScript.sh myConfigFile.ini
)很难说没有进一步的信息。记住/path/to/MyScript.sh myConfigFile.ini
不一定是 zsh 脚本可能需要花钱购买可能真的是可执行的。因此,MyScript.sh
可能需要在MyScript.sh
中设置环境。