【问题标题】:Failure in executing shell script producing output on Ubuntu on Windows在 Windows 上的 Ubuntu 上执行产生输出的 shell 脚本失败
【发布时间】:2018-04-29 13:58:04
【问题描述】:

我很难在 Windows 10 上的 Ubuntu 上执行我的 shell 脚本。脚本非常简单:

# file name: submission.sh
echo "Hello world" > output.txt

当我使用命令sh submission.sh 执行它时,它给了我一个错误:

$ sh submission.sh
: Directory nonexistentssion.sh: cannot create output.txt

但是,当我把脚本改成

# file name: submission.sh
echo "Hello world"

并使用相同的命令 sh submission.sh 执行它,它给了我正确的输出

$ sh submission.sh
Hello world

当脚本涉及将输出定向到文件时,Windows 上的 Ubuntu 上的 bash 似乎无法正确处理。有什么解决方案或解决方法吗?

编辑: 关于我的系统的详细信息:

  • 程序:“Windows 上的 Ubuntu 上的 Bash”
  • 操作系统:Windows 10 版本 1709

编辑: 直接在终端上输入命令即可,即

$ echo "Hello world" > output.txt
$ cat output.txt
Hello world

我还是想把命令放到一个文件里执行文件,而不是直接把命令写到终端,这个还是没解决。

【问题讨论】:

  • 顺便说一句:sh 通常不是bash
  • 您似乎在nonexistentssion.sh:No such file or directorytput.txt 中有错误的文本,这表明您在文件\r 中可能有Windows 行尾。如果您使用 Windows 程序(如记事本)创建脚本,那么可能就是这种情况。如果您有dos2unix,请在您的脚本上运行它并重试。
  • @cdarke 是的,你是对的。现在可以了。这很奇怪,因为我在 Windows 上使用 Ubuntu 上的 Bash 中的 nano 对其进行了编辑,所以我认为他们使用 \n 作为行尾。如果你想写一个正确的答案,我很乐意接受。
  • @Firman:被质疑了。

标签: bash sh windows-subsystem-for-linux


【解决方案1】:

nonexistentssion.sh:No such file or directorytput.txt 中的文本似乎有错误,这表明文件 \r 中可能有 Windows 行尾。如果您使用 Windows 程序(如记事本)创建脚本,那么可能就是这种情况。

如果您有 dos2unix,请在您的脚本上运行它并重试。

顺便提一下,运行sh 与运行bash 不同。在这种情况下,它不会有任何区别,但是sh 是一个 POSIX shell,完整的bash 有很多扩展在sh 下不起作用。

某些平台将sh 作为bash 的符号链接运行,这使人们误以为它们是相同的,但bash 检测到这一点并在以sh 运行时切换到POSIX 模式。这是一个常见的问题。

【讨论】:

    【解决方案2】:

    在您的submission.sh 文件中,最好添加shebang 作为第一行。 如果要使用sh 而不是bash,您要考虑的另一件事是将echo 替换为printf,以实现可移植性

    您的代码应该类似于:

    #!/bin/bash
    printf "Hello world!\n" > output.txt
    

    您可以简单地通过./submission.sh 调用它,并且由于shebang,您的终端将知道如何打开它[:

    附:请记住,由于 Ubuntu 中的标准 umask,您可能需要在运行之前执行 chmod u+x submission.sh

    另外,请注意您的错误可能是由权限问题引起的。 尝试在要启动脚本的文件夹中添加写入权限。

    【讨论】:

    • 那仍然行不通。 : No such file or directorytput.txt。我拥有该文件夹的所有权限(rwx),所以我怀疑问题实际上出在 Windows 上 Ubuntu 上的 bash 上。我已经在 Ubuntu 机器上尝试过(不是 Windows 上的 Ubuntu),效果非常好。
    • 也许您想提供更多信息?比如使用的程序名称、版本、操作系统...例如,如果你使用的是gitbash,则不支持重定向。
    • 我已经把它放在我的帖子上了。它是使用 Windows 10 版本 1709 的“Bash on Ubuntu on Windows”。
    • 这可能是由于 Windows 权限不同于 WSL/Ubuntu 权限。你的当前目录是在 /mnt/c 子目录还是 / 子目录?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 2015-01-05
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多