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