“/dev/fd/63 没有那个文件或目录”

Rad*_*adu 5 command-line bash virtualbox wget 18.04

我一直在尝试在 chroot 中运行一个命令(对此很陌生),我得到以下输出。

root@hostname:~ # bash <(wget -q0 https://raw.githubusercontent.com/ubports/unity8-desktop-install-tools/master/install.sh) 
bash: /dev/fd/63: No such file or directory root
Run Code Online (Sandbox Code Playgroud)

Ser*_*nyy 16

TL;DR:将/rootchroot 外部的文件夹复制到 chroot 目录中

<(...)运算符称为进程替换,是一种运行命令的方式,其输出进入匿名管道。这就是 /dev/fd/63 。这个想法是允许外部命令(这里是bash)将另一个命令输出视为一个文件。通常,该形式将用于 <将该伪文件对象重定向到 的bash输入流中。

bash < <(wget -q0 https://raw.githubusercontent.com/ubports/unity8-desktop-install-tools/master/install.sh)
Run Code Online (Sandbox Code Playgroud)

这与一般情况没有什么不同wget https://stuff.com/blah | bash。在这两种情况下,通常不建议使用此类命令,除非您百分百确定您正在下载的脚本不是来自粗略来源并且不是恶意软件。

但是,由于您提到了运行命令 inchroot和脚本输出No such file or directory root,并且因为 bash 允许运行脚本,所以您的脚本正在执行,但chroot 中bash script.sh没有指定的目录。root你可以通过修复它sudo cp -R /root chrootdir。为了获得更好的结果,我建议先阅读脚本,看看它需要什么,然后将其复制到 chroot 文件夹,然后才在该文件夹中本地运行该脚本。无需多次运行 wget

所以脚本有效。shell 脚本中的错误通常以形式出现 <shell>: <command user typed>: error message,因此脚本被临时存储为 /dev/fd/63 并运行,但它只是找不到它需要的内容。

也可以看看,


小智 8

错误信息

/dev/fd/63 No such file or directory
Run Code Online (Sandbox Code Playgroud)

问题根源

事实上该目录/dev/fd/在该机器上不存在。

解决方案

解决方案是创建一个从/proc/self/fd到 的符号链接/dev/fd,如下所示:

ln -s /proc/self/fd /dev/fd
Run Code Online (Sandbox Code Playgroud)

如果没有这个,进程替换<(..)将无法在 QNAP 上运行。