.sh输出到.txt文件 - 我做错了什么?

时间:2017-01-22 03:05:13

标签: windows bash shell

我正在运行Windows 10,我正在尝试将test.sh文件的错误输出保存到文本文件中。 所以我创建了test.sh文件,并在其中写了一个未知的命令(即" blablubb")。

之后我打开终端(cmd.exe),切换到目录并输入test.sh 2>> log.txt

另一个窗口打开" / usr / bin / bash --login -i \ test.sh"在标题栏中,显示我" bash:blablubb:命令未找到"然后立即关闭。

我想保存该输出,因为bash窗口只是暂时打开。每次谷歌搜索都会把我带到关于重定向输出和Stream2 ist STDERR的网站,因此我应该使用test.sh 2>> log.txt或者熟悉STDERR流的东西。

如果我尝试使用test.sh文件和内容:

#!/bin/bash echo hi there

我在短暂打开的bash窗口中获取输出:

bash: #!/bin/bash: No such file or directory hi there

但是log.txt文件是空的。

如果我在test.sh文件中只有echo hi there,我会在bash窗口中获得bash: echo: command not found。 log.txt也是空的。

如果我在终端中直接输入以下内容,则输出将写入log.txt:

echo hi > log.txt 2>&1

如果我直接在终端输入:

echdo hi > log.txt 2>&1

我得到了Der Befehl" echdo" ist entweder falsch geschrieben oder konnte nicht gefunden werden。'在log.txt文件中。

所以我猜输出的重定向工作正常,直到我使用test.sh. 我知道.sh文件来自unix世界并且问题可能存在,但我不知道为什么我不能将bash-console中简要显示的输出重定向到文本文件。

3 个答案:

答案 0 :(得分:0)

了解您是否正在运行适用于Linux的Windows子系统(Beta)会有所帮助。或者如果你正在做其他事情。我假设这是你在Windows 10上做的事情。

如果是这种情况,你使用bash来运行脚本吗?

您使用的是win-bash吗?

如果是win-bash,我不是很熟悉,并会推荐Windows Subsystem for Linux(Beta),原因如下。 win-bash虽然酷,但可能与2>>等重定向运算符兼容。

你有stdout和stderr,默认情况下(如果你没有指定)>> (或追加)只会将标准输出附加到txt文件中。

如果使用2,它会将标准错误附加到txt文件中。示例:test.sh 2>> log.txt的

可以在此site更好地描述。

要获得追加stdout和stderr的命令,请转到page

请告诉我这是否没有回答你的问题。此外,尝试首先搜索此答案可能更有价值,并解释为什么您的搜索没有发现任何内容或对问题的解释进行更广泛的澄清。我喜欢回答问题和帮助,但创建一个新的论坛页面可能是一个简单的答案可能是无效的。我对你的问题有很多乐趣。我希望我能帮到你。

答案 1 :(得分:0)

2>>重定向语法仅在包含该语法的命令行由bash 解释时才有效。因此,即使您运行的程序恰好是用bash编写的,它也无法在Windows命令提示符下运行。当bash运行时,为时已晚;它获取参数,因为它们由CMD或Windows命令解释器解释。 (在这种情况下,我猜这意味着shell脚本会发现它有一个命令行参数[$1],其值为“2”。)

如果你打开一个bash窗口(或者只是在命令中键入bash),然后在那个 shell中键入test.sh 2>>log.txt命令行,它将把文件中的错误消息正如您所期望的那样。

你也可以通过在Windows命令提示符下键入bash -c "test.sh 2>>log.txt"来一步完成,但我不确定; Windows引用不同于* nix引用,这可能会将文字引号传递给bash,这将无效。

请注意,CMD也具有2>>语法,如果您尝试使用2>>errlog.txt运行不存在的Windows命令,则“无法识别”错误消息将转至文件。我认为问题来自于CMD和bash对“标准错误”意味着什么不同意,因此重定向Windows的错误输出并不能捕获bash的错误输出。但那只是猜测;我没有便于测试的bash-on-Windows设置。

答案 2 :(得分:0)

这很有道理。谢谢Mark!

考虑到什么标记,我会得到Linux子系统Linux(Beta)。有说明here。然后从那里运行你的脚本。