在Ubuntu 16.04 xenial中使用Bash 4.3.48和LEMP,我创建了一个舒适功能来创建一个php info file(以更好地了解我的PHP环境),然后在2小时后删除它.但我在终端上调用该功能时遇到问题.
重现我的问题的步骤
#!/bin/bash
drt="/var/www/html"
pif() {
cat > "$drt"/info.PHP <<< "<?PHP PHPinfo();"
rm "$drt"/info.PHP | at Now + 2 hours
}
2)源文件.
pif
可悲的是,在/ var / www / html中没有为我创建名称为info.PHP的文件.我仔细检查了一下.
以下是以这种方式执行函数的完整跟踪(pif):
+ pif
+ cat
+ at Now + 2 hours
+ rm /var/www/html/info.PHP
warning: commands will be executed using /bin/sh
job 17 at Fri Apr 6 05:43:00 2018
cat > "$drt"/info.PHP <<< "<?PHP PHPinfo();"
文件创建正常.
我的问题
更新
1)我确实对/ var / www / html有写权限.
source myFunctions.sh
3)-a pif类型的输出是:
pif is a function
pif ()
{
cat > "$drt"/info.PHP <<< "<?PHP PHPinfo();";
rm "$drt"/info.PHP | at Now + 2 hours
}
解决方法:
在创建文件info.PHP之后,您似乎打算让下一个命令安排删除:
rm "$drt"/info.PHP | at Now + 2 hours
但那不是正在发生的事情.它现在运行rm命令,然后pipes其standard output(通常没有任何内容可写,因为默认情况下rm成功默认)到at命令的standard input.
如果您确实需要使用shell函数来调度文件的删除,那么您应该在标准输入处提供命令作为文本,或者安排运行删除文件的单独脚本的命令.有关如何计划与at一起运行的命令的详细信息,请参阅at(1).
请注意,您可以从跟踪中看到这是发生的事情:
+ at Now + 2 hours
+ rm /var/www/html/info.PHP
管道中的命令以异步方式运行.该跟踪显示,当您给它两个以|分隔的命令时,shell的行为应该如此.它运行出现在管道右侧的at命令,以便它可以接收来自rm命令的数据.然后它立即运行rm命令.当它这样做时,rm命令删除了该文件.为了防止这种情况,您必须告诉以后再运行该命令,而不是自己在管道中立即运行它.
如果你想使用类似于你拥有的东西,并且drt的值(在你的例子中是/ var / www / html)不包含任何空格或其他将被/ bin / sh专门处理的字符(用于运行命令),然后您可以使用:
at Now + 2 hours <<<"rm -- $drt/info.PHP"
如果已知drt的值不以 – 开头,则可以安全地省略 – 参数.在你的情况下,你似乎控制了$drt,这似乎是一个非常安全的赌注.
您可以通过安排在较早的时间运行它们(如立即(现在)或一分钟(现在为1分钟))来测试您的at命令.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。