我是java新手,在windows 10上安装了以下jdk:
C:\Program Files\AdoptOpenJDK\jdk-11.0.8.10-openj9
我可以调用编译器 javac
从cygwin的bash命令行(在x-terminal中),但它创建了许多错误,似乎两者都没有 stdout
或者 stderr
。我需要把它们发送到一个我可以用vim阅读的文件中。
这是我的调用命令
# mk.bash
# -------
javac \
-classpath "/c/Program Files/.../cplex.jar" \
TestSetup.java
这个 classpath
争论在这里是无关紧要的,因为我只想把重点放在捕捉 javac
的输出以vim可读的方式。
发行 ./mk.bash >| mk.out
生成空的 mk.out
,也一样 ./mk.bash 2>&1 >| mk.out
. 几十年来,我一直使用后一种模式将stderr重定向到stdout并覆盖目标文件。
我可以使用 script
命令发送 javac
输出到 mk.out
:
script mk.out
./mk.bash
exit
然后我可以使用 Vim
. 但是,内容被许多二进制字符(下面的图像和文件链接)混淆了。通常情况下,我可以用 dos2unix
,但在这个输出上,它由于二进制字符而退出。
作为清理非文本内容的另一种方法,vim有一个 fileformat=dos
可使用输入的选项 :e ++ff=dos %
. 这个 e
以及 %
说要编辑当前文件,而 ++ff=dos
说把文件解释成 dos
格式( ff
是 fileformat
). 所有这一切都是为了清除由于unix和dos中不同的行尾而产生的视觉工件。所有的错误消息仍然穿插着看起来像转义字符的内容 ^[
.
有没有什么办法 javac
只生成纯文本输出还是清除输出?
以下是vim中非纯文本文件的图像:
我怀疑这一切都是相关的,但我下面这个网页编译一个简单的java应用程序 TestSetup.java
调用第三方工具:https://kunlei.github.io/cplex/cplex-java-setup.
1条答案
按热度按时间exdqitrt1#
底线在前面
下面的bash命令发送
stdout
以及stderr
从javac
到屏幕和文件mk.out
:怎么找到的
我发现问题主要是bash管道、重定向和
script
命令。后者负责ansi代码。我之前无法确定这一点,因为我无法捕获javac
文件中的错误消息script
. 所以我先解决了这个问题,然后比较了script
因为没有script
. 这是我发现的。下面的bash命令创建不带ansi代码的dos格式文件:
以前,我有:(1)
2>&1 >| mk.out
代替(2)>| mk.out 2>&1
. 对于选项(1),我想stderr
成为指向stdout
,所以我只需要指挥stdout
至mk.out
.但事情不是这样的。在选项(1)中,规范
2>&1
指导stderr
为了什么stdout
当前指向屏幕。随后的>| mk.out
然后指示stdout
(仅限于std.out
)至mk.out
. 不幸的是,这意味着stderr
还是要上银幕。急板地,mk.out
空的(坏的)。在选项(2)中,
stdout
首先指向mk.out
. 随后的2>&1
然后指示stderr
为了什么stdout
指向,即。,mk.out
. 因此javac
将错误消息发送到mk.out
. 它没有包含ansi代码,这很好。虽然方案(2)可行,但并不理想;错误消息不会显示在屏幕上。我又回到了这里
script
发现它引入了ansi代码:因为以上解决了重定向的问题
stderr
,我寻找bash选项来避免script
. 以下发送stderr
到屏幕和mk.out
:根据上面选项(1)的解释,它看起来不应该工作,但是bash在管道中使用时会出现异常。明确地,
stderr
重定向到什么stdout
定向到,但仅在所有重定向之后。在管道中,上述情况意味着javac
的stdout
指向tee
的stdin
,只有这样javac
的stderr
指向目标javac
的stdout
,即。,tee
的stdin
.供参考:初始解决方案(
javac
的xstdout选项)我发现我的
javac
具有命令行选项-Xstdout OutputFileName.txt
专门为此目的。不幸的是,不是所有的
javac
我在网上找到的文档显示了这个选项的可用性。在这种情况下,我找到的最直接的解决办法是:term cat The/Output/File.Path
在 vim 。许多vim替代品也显示在该页面上,以及这里
为备将来参考,如有需要,我发现一些相关的页面有:
https://superuser.com/questions/380772/removing-ansi-color-codes-from-text-stream
https://unix.stackexchange.com/questions/14684/removing-control-chars-including-console-codes-colours-from-script-output
https://unix.stackexchange.com/questions/4527/program-that-passes-stdin-to-stdout-with-color-codes-stripped
提到
ansi2txt
但是你需要ubuntu。