用一个 ; 或 && 与 $@

Mik*_*ike 3 bash shell-script

我正在尝试用 cron 包装器做一些事情,我的 cron 看起来像

* * * * * root /usr/bin/wrapper cd /tmp/ && ls 
Run Code Online (Sandbox Code Playgroud)

然后包装看起来像

#!/bin/bash 

"$@"
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我无法让分号或 && 像我希望的那样工作。

[root@domain.net ~/test]# pwd
/root/test
[root@domain.net ~/test]# ls
test.sh
[root@domain.net ~/test]# ./test.sh cd /tmp && ls
test.sh
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下,它进入 tmp 然后 weapper 脚本退出..它在我的 cwd 中运行 ls。

如果我在命令周围添加 '' 我得到

[root@domain.net ~/test]# ./test.sh 'cd /tmp && ls'
./test.sh: line 3: cd /tmp && ls: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我猜用“$@”它正试图将单引号添加到正在运行的命令中

我支持我可以去掉 "$@" 之前的单引号,但我希望不要这样做.. 任何提示或者这甚至可以在 bash 中解决?

Mic*_*zek 8

/usr/bin/wrapper cd /tmp/ && ls被解析为(/usr/bin/wrapper cd /tmp/) && ls. 即使您确实设法wrapper正确地将参数传递给它,它也无法理解它们;&&是一个外壳结构。我不确定您使用此包装器脚本的确切目标是什么,但我怀疑您可以将其替换为bash -c,它接受一个字符串并告诉 bash 评估它,就像您直接将它输入到 shell 中一样:

* * * * * root bash -c "cd /tmp/ && ls"
Run Code Online (Sandbox Code Playgroud)