perl - 为什么 perltidy 要去标准输出?
问题描述
我有一个 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
解决方案
perltidy $f > $f
对于任何程序,这永远不会做你想做的事。当您使用 运行程序时> $f
,它会告诉 shell 您希望程序在其标准输出连接到 时运行$f
。因此,在程序运行之前,shell 会打开$f
以进行写入,这会破坏文件的内容。然后它将句柄连接到孩子的标准输出,然后运行 perltidy,它尝试读取$f
并发现......什么都没有,因为原始内容已经被清除了。不是成功的秘诀。这就是为什么 perltidy 首先拥有自己的“就地编辑”功能。
推荐阅读
- arrays - Trying do deal with an object that can be an array or a number
- c - 如何用不同的符号和对角线在C中绘制一个正方形?
- windows - 无法使用 hyperv 在 Windows 中启动 minikube
- functional-programming - Java兼容的简单表达式语言
- unit-testing - [PHPUnit]、[Symfony]:测试实体是否保存在数据库中
- python - Python 什么是正确的时间格式:2018-11-13T20:20:39+00:00
- c# - 在自定义 UserControl 上强制透明背景
- automation - 如何获取 SVG 或 PNG 中的徽标集合并自动制作 Visio 模板集合?
- mysql - 试图从一个表中删除另一个表中存在的记录
- django - 我想使用 Django 为两个外键添加两个注释。我该怎么做呢?