我在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无法正常运行。这有什么解决方案或解决方法吗?
修改 我系统的详细信息:
修改 直接在终端上输入命令即可,即
$ echo "Hello world" > output.txt
$ cat output.txt
Hello world
我仍然希望将命令放在文件上并执行文件而不是直接将命令写入终端,这仍然没有解决。
答案 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
。
另外,请注意您的错误可能是由权限问题引起的。 尝试在要启动脚本的文件夹中添加写入权限。