为什么 perltidy 会输出到标准输出?

Why is perltidy going to stdout?

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

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

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

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

-b backup original to .bak and modify file in-place

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

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

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

skipping file: file.pl: Zero size

我找到了一个解决方法,它给出了我想要的结果,但它似乎牵强附会:

\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

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

要忽略 .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 $f > $f

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