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

How to Make my R script executable?

我知道这是重复的高风险,但在 none 的其他问题中,我找到了我的问题的答案。以下是我已经尝试过的内容的总结。

我有一个 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!"

我做错了什么?

啊,是回车return(\r)的问题,加到第一行,如果你用的是vi编辑器,:set list会显示的。行结尾将显示为 $,回车 return 字符将显示为 ^M.

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

顺便说一句,您可以通过进入 insert(i)/Append(a) 模式并键入 ctrl+v 然后 ctrl+m

在 vi​​ 中插入 \r

如果你想直接指向可执行文件,那么你需要shebang之后的完整路径(没有space):

#!/usr/bin/Rscript

正如 Ravi 指出的那样,如果此修复不起作用,那么解决方案可能只涉及删除换行符并重新插入。

我不喜欢 env 使事情更便携的解决方法,因为它使行更加混乱,而且大多数人没有意识到它实际上是在调用另一个程序(即 env) 到 运行 修改后的代码 shell。有关 here.

的更多信息

我找到的最佳答案在这里:env: python\r: No such file or directory

Open the file in vim or vi, and administer the following command:

:set ff=unix

Save and exit:
:wq

Done!