shell脚本中的perl -p -i -e

时间:2017-08-23 12:07:35

标签: linux bash shell perl docker

#!/usr/bin/env bash
DOCUMENT_ROOT=/var/www/html/

rm index.php
cd modules/mymodules/

perl -p -i -e 's/x.xx.xx.y/dd.dd.ddd.dd/g' `grep -ril y.yy.yy.y *`

显示警告

-i used with no filenames on the command line, reading from STDIN.

它可以防止运行其余的脚本。

任何解决方案?

其实我需要运行

perl -p -i -e 's/x.xx.xx.y/dd.dd.ddd.dd/g' `grep -ril y.yy.yy.y *`
Inside a shell script

我正在使用带有docker的ubuntu。

1 个答案:

答案 0 :(得分:4)

让我们一步一步看看这一步。首先,您正在运行此grep命令:

grep -ril y.yy.yy.y *

以递归方式搜索当前目录中的所有文件和目录。它查找包含字符串" y.yy.yy.yy"的文件。在任何情况下,都会返回包含此文本的文件列表。

此命令将返回文件名列表或不返回任何内容。

然后从grep命令返回的任何内容作为参数传递给Perl命令:

perl -p -i -e 's/x.xx.xx.y/dd.dd.ddd.dd/g' [list of filenames]

如果grep返回文件列表,那么这里的-p选项意味着列表中每个文件中的每一行(依次)通过该替换运行,然后打印到新文件。 -i表示每个旧文件都有一个新文件,新文件的名称与旧文件相同(命令运行后删除旧文件)。

到目前为止一切顺利。但是如果grep没有返回任何文件名,会发生什么?在这种情况下,您的Perl命令不会获取任何文件名,并且会触发您看到的错误。

所以我的(第二个)猜测是你的grep命令没有做你想要的,并且返回一个空的文件名列表。尝试单独运行grep命令,看看你得到了什么。