我有一个 bash 命令,get-modified-perl-files它返回我在存储库中修改的所有 Perl 文件。我想对所有这些文件使用 perltidy。
我创建了一个 bash 函数来完成这项工作:
tidy() {
for f in `get-modified-perl-files`
do
echo $f
perltidy -b $f
done
}
Run Code Online (Sandbox Code Playgroud)
根据 perltidy 的帮助页面,-b 选项应该创建我的原始文件的备份并就地修改它:
-b 将原始文件备份到 .bak 并就地修改文件
但是,当我启动我的 bash 功能时,没有创建备份。我的文件没有被修改,但是 perltidy 的输出打印在标准输出上。因此,我决定以这种方式更改对 perltidy 的调用:
\cp $f $f.bak
perltidy $f > $f
Run Code Online (Sandbox Code Playgroud)
现在,当我运行我的命令时,我的文件备份正确完成,但原始文件被清空,并显示以下消息:
跳过文件:file.pl:零大小
我找到了一种解决方法,可以给出我想要的结果,但似乎有些牵强:
\cp -f $f $f.bak
echo "$(perltidy $f)" > $f
Run Code Online (Sandbox Code Playgroud)
为什么 -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
Run Code Online (Sandbox Code Playgroud)
默认情况下perltidy不将文件内容打印到 STDOUT。这样做需要-st选项(或--standard-output)。既然你没有使用该选项perltidy的命令行,有可能是一个.perltidyrc与文件-st在它正在使用。
要忽略该.perltidyrc文件,请使用-npro( --noprofile) 选项:
perltidy -npro -b $f
Run Code Online (Sandbox Code Playgroud)
请参阅已安装版本的手册页的“使用.perltidyrc命令文件”部分:
perldoc perltidy
Run Code Online (Sandbox Code Playgroud)
有关其他调试信息,您可以运行:
perltidy -dpro
perltidy -dop
Run Code Online (Sandbox Code Playgroud)
另一种可能性是您将perltidy命令别名为perltidy -st. 您应该能够避免使用别名:
\perltidy -npro -b $f
Run Code Online (Sandbox Code Playgroud)
现在您编辑了问题以显示您的.perltidyrc文件,看来罪魁祸首是:
--perl-best-practices
Run Code Online (Sandbox Code Playgroud)
要么更改 rc 文件,要么像上面一样忽略它。
perltidy $f > $f
对于任何程序,这永远不会做你想做的事。当您使用 运行程序时> $f,它会告诉外壳程序您希望程序在其标准输出连接到 的情况下运行$f。所以在程序运行之前,shell 打开$f进行写入,这会破坏文件的内容。然后它将句柄连接到子进程中的标准输出,然后运行 perltidy,它试图读取$f并找到......什么都没有,因为原始内容已经被清除了。不是成功的秘诀。这就是为什么 perltidy 首先拥有自己的“就地编辑”功能。