4

我有一个 bash 命令,get-modified-perl-files它返回我在存储库中修改的所有 Perl 文件。我想在所有这些文件上使用 perltidy。

我创建了一个 bash 函数来完成这项工作:

tidy() {
    for f in `get-modified-perl-files`
    do
        echo $f
        perltidy -b $f
    done
}

根据 perltidy 的帮助页面, -b 选项应该创建我的原始文件的备份并就地修改它:

-b 将原始文件备份到 .bak 并就地修改文件

但是,当我启动我的 bash 函数时,没有创建备份。我的文件没有被修改,但是 perltidy 的输出打印在标准输出上。因此,我决定以这种方式更改对 perltidy 的调用:

\cp $f $f.bak
perltidy $f > $f

现在,当我运行命令时,我的文件备份已正确完成,但原始文件已清空,并显示以下消息:

跳过文件:file.pl:零大小

我找到了一种解决方法,可以提供我想要的结果,但它似乎牵强附会:

\cp -f $f $f.bak
echo "$(perltidy $f)" > $f

为什么 -b 选项不起作用?有没有办法在不使用这种奇怪的重定向的情况下做同样的工作?


编辑:这是我的.perltidyrc文件:

--perl-best-practices
--no-standard-error-output
--closing-side-comments
--closing-side-comment-interval=10
--blanks-before-subs
--blanks-before-blocks
--maximum-line-length=130
4

2 回答 2

5

perltidy $f > $f

对于任何程序,这永远不会做你想做的事。当您使用 运行程序时> $f,它会告诉 shell 您希望程序在其标准输出连接到 时运行$f。因此,在程序运行之前,shell 会打开$f以进行写入,这会破坏文件的内容。然后它将句柄连接到孩子的标准输出,然后运行 ​​perltidy,它尝试读取$f并发现......什么都没有,因为原始内容已经被清除了。不是成功的秘诀。这就是为什么 perltidy 首先拥有自己的“就地编辑”功能。

于 2021-03-04T15:45:11.270 回答
5

默认情况下perltidy不将文件内容打印到 STDOUT。这样做需要-st选项(或--standard-output)。由于您没有在perltidy命令行上使用此选项,因此其中可能有一个正在使用的.perltidyrc文件。-st

要忽略该.perltidyrc文件,请使用-npro( --noprofile) 选项:

perltidy -npro -b $f 

请参阅手册页的“使用.perltidyrc命令文件”部分了解您安装的版本:

perldoc perltidy

有关其他调试信息,您可以运行:

perltidy -dpro
perltidy -dop

另一种可能性是您将perltidy命令别名为perltidy -st. 您应该能够避免使用别名:

\perltidy -npro -b $f 

现在您编辑了问题以显示您的.perltidyrc文件,看起来罪魁祸首是:

--perl-best-practices

要么更改 rc 文件,要么像上面一样忽略它。

另请参阅Perltidy 始终打印到标准输出

于 2021-03-04T11:15:11.620 回答