如何使我的R脚本可执行?

22

我知道这有很高的重复风险,但在其他问题中我都没有找到解决我的问题的答案。以下是我已经尝试过的概述。

我有一个 R 脚本文件 file.r

#!/usr/bin/env Rscript 
print("Hello World!")

这是一个可执行文件(chmod +x file.r),我上次使用距今约一个月左右,运行命令如下:

$ ./file.r

然而,今天:

$ ./file.r
/usr/bin/env: 'Rscript\r': No such file or directory

实际上:

$ which Rscript
/usr/bin/Rscript 

因此,我将shebang更改为:#!/usr/bin Rscript,但是:

$ ./file.r
/usr/bin: bad interpreter: Permission denied

然后我想以超级用户身份运行它,但是:

$ sudo ./file.r
sudo: unable to execute ./file.r: Permission denied

我看了一些资料后发现重新安装R可能会解决我的问题,因此我卸载了R并重新安装。不幸的是,之前写的内容仍然适用。请注意,以下内容适用于两个版本的shebang:

$ Rscript file.r
[1] "Hello World!"

我做错了什么?


1
#!/usr/bin Rscript 绝对没有意义。我认为你想做的是类似 #!/usr/bin/Rscript 这样的事情,以便直接指向可执行文件的路径。如果 Rscript 存储在那里,那么这将起作用。在我看来,原始错误中的 "\r" 部分是导致问题的原因。你尝试过删除整个 shebang 行并重新输入吗? - Dason
3个回答

22

啊,这是回车(\r)的问题,它被加到了第一行上。如果你使用vi编辑器,:set list会显示它。行尾将显示为 $,回车符将显示为 ^M。

#!/usr/bin/env Rscript  Makes your script portable than #!/usr/bin/Rscript

顺便提一下,您可以通过进入插入(i)/追加(a)模式并键入Ctrl + V,然后键入Ctrl + M,在vi中插入\r。


那就是这样,谢谢。对于Emacs用户的参考:您可以通过执行“M-x revert-buffer-with-coding-system”并选择“utf-8-unix”来显示行尾。 - k88074

3

如果您想直接指向可执行文件,则需要在shebang之后加上完整的路径(没有空格):

#!/usr/bin/Rscript

如Ravi所指出的,如果这个修复方案不起作用,那么解决方案可能只涉及删除换行符并重新插入。
我不喜欢使用`env`变通方法使得事情更加便携,因为它使得代码行更加混乱,大多数人不认识它实际上是调用另一个程序(即`env`)在修改后的shell中运行代码。更多信息请点击此处

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接