【问题标题】:.sh output to .txt file - what am I doing wrong?.sh 输出到 .txt 文件 - 我做错了什么?
【发布时间】:2017-01-22 03:05:13
【问题描述】:

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

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

另一个窗口打开,标题栏中显示“/usr/bin/bash --login -i \test.sh”,显示“bash: blablubb: command not found”,然后立即关闭。

我想保存该输出,因为 bash 窗口只打开一瞬间。每次 google 搜索都会将我带到谈论重定向输出和 Stream2 是 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 控制台中简要显示的输出重定向到文本文件。

【问题讨论】:

    标签: windows bash shell


    【解决方案1】:

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

    如果你打开一个 bash 窗口(或者只是在命令一中输入 bash)然后在 that 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 设置。

    【讨论】:

    • 现在我知道我的问题了!混乱始于不了解命令行差异。任何黑色窗口对我来说都只是一个终端或命令行。 Shell、bash、batch 等对我来说是一本尚未打开的书。
    • Cmd 有自己匹配的重定向语法。
    【解决方案2】:

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

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

    你在用 win-bash 吗?

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

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

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

    site 可以更好地描述这一点。

    要准确获取附加标准输出和标准错误的命令,请访问page

    如果这不能回答您的问题,请告诉我。此外,首先尝试搜索此答案并解释为什么您的搜索没有找到任何结果或更广泛地说明问题所在可能更有价值。我喜欢回答问题和提供帮助,但创建一个新的论坛页面可能是一个简单的答案可能是无效的。你的问题让我很开心。希望对您有所帮助。

    【讨论】:

    • 谢谢。我已经搜索过它并尝试了 test.sh 2>> log.txt 但这只会创建一个空文件。我还尝试了诸如“test.sh >>log.txt 2>&1”之类的东西,但没有成功。
    • 如果我应该提供一些额外的信息,请告诉我。
    • 你用的是win-bash吗?如果您在 cmd 中运行 .sh 文件,则必须有其他东西来帮助运行它。我会在原始帖子中包含您已经尝试过的内容以及您为在 cmd 中运行 .sh 而安装的内容。
    【解决方案3】:

    这很有意义。谢谢马克!

    考虑到标记所说的内容,我将获得适用于 Linux 的 Windows 子系统(测试版)。有说明here。然后从那里运行你的脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 2014-03-28
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多