微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

bash – 不会在源文件中的函数内创建文件

在Ubuntu 16.04 xenial中使用Bash 4.3.48和LEMP,我创建了一个舒适功能来创建一个php info file(以更好地了解我的PHP环境),然后在2小时后删除它.但我在终端上调用功能时遇到问题.

重现我的问题的步骤

1)使用函数创建一个文件

#!/bin/bash
drt="/var/www/html"

pif() {
    cat > "$drt"/info.PHP <<< "<?PHP PHPinfo();"
    rm "$drt"/info.PHP | at Now + 2 hours
}

2)源文件.

3)调用终端中的功能

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有写权限.

2)我通过以下方式获取文件

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但随后立即删除它.

创建文件info.PHP之后,您似乎打算让下一个命令安排删除

rm "$drt"/info.PHP | at Now + 2 hours

但那不是正在发生的事情.它现在运行rm命令,然后pipesstandard 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 举报,一经查实,本站将立刻删除。

相关推荐