无法在Windows上执行在Ubuntu上生成输出的shell脚本

时间:2018-04-29 13:58:04

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

我在Windows 10上的Ubuntu上使用bash执行我的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进行攻击”
  • 操作系统:Windows 10版本1709

修改 直接在终端上输入命令即可,即

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

我仍然希望将命令放在文件上并执行文件而不是直接将命令写入终端,这仍然没有解决。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

您的代码应该类似于:

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

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

P.S。请记住,由于Ubuntu中的标准umask,您可能希望在运行它之前执行chmod u+x submission.sh

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