我正在尝试使用以下命令以 root 身份从 URL 运行脚本:
sudo bash <(curl -s http://copy.com/gLVZIqUubzcS/popcorn)
但我收到这个错误:
bash: /dev/fd/63: Aucun fichier ou dossier de ce type
法语“未找到”。有什么想法吗?
PS:我运行的是Ubuntu 12.04
答案1
sudo
关闭除 stdin、stdout 和 stderr 之外的所有打开的文件描述符(请参阅 参考资料man sudo
),因此进程替换在 OOTB 中不起作用sudo
。
比较
$ sudo bash <(echo echo foo)
bash: /dev/fd/63: No such file or directory
和
$ bash <(echo echo foo)
foo
您可以解决此问题(或使用-C
标志 to sudo
),但无论如何,做您想做的事情是不好的 - 尽管很常见 - 做法。如果您真的只想运行安装程序,请获取root
-shell第一的然后运行其余部分而不使用sudo
.
答案2
不要使用这样的进程替换。实际上,无论如何,它几乎就是这样:
sudo sh <<CURL_SCRIPT
$(curl -s http://copy.com/gLVZIqUubzcS/popcorn)
CURL_SCRIPT
或者:
curl -s http://copy.com/gLVZIqUubzcS/popcorn | sudo sh
除非您尝试运行的脚本使用bashisms
上述内容才能工作。如果它确实使用bash
-only 语法,你应该这样做:
curl -s http://copy.com/gLVZIqUubzcS/popcorn | sudo . /dev/stdin
虽然上面的方法似乎不起作用,但我预计这是由于sudo
不喜欢 shell 的内置.dot.
所以这样做:
curl -s http://copy.com/gLVZIqUubzcS/popcorn | sudo ${0#-} /dev/stdin
您也可以简单地执行以下操作:
sudo sh -c "$(curl -s http://copy.com/gLVZIqUubzcS/popcorn)"
bash
当您可以使用 shell 的内置函数时,您不需要再次调用可执行文件。