6

我正在查看一些旧的 shell 脚本,其中有一行我不太明白:

~]$ sftp -b /dev/fd/3 dropuser@targetftpserver.company.com

我可以从 man 文件中看到 -b 用于批处理,并且参数应该是批处理文件。

在这种情况下,看起来批处理文件应该位于 /dev/fd/3 - 软盘驱动器上?我似乎无法理解它。

任何想法这应该做什么?

4

2 回答 2

3

/dev/fd实际上不是软盘驱动器——“fd”代表“文件描述符”。man fd在终端中尝试。

此页面概述了正在发生的事情: http: //lists.apple.com/archives/darwinos-users/2004/Apr/msg00042.html。基本上,SFTP 写入的第一个文件(可能是它下载的文件?)作为批处理文件传回自身。

如果没有看到整个脚本或不了解 SFTP 的内部结构,我无法确切知道发生了什么。我猜想脚本连接到的服务器上有一个文件列表,/dev/fd/3 用于让SFTP下载列表,然后下载文件而不重新连接。

于 2013-02-20T18:39:41.493 回答
3

这些"/dev/fd*"文件是特殊设备。这些并没有真正占用您系统上的太多空间。它们允许进程按编号访问文件描述符;0,1,2是标准input的 ,standard outputstandard error, 其他打开的文件以3

在您的情况下sftp,使用-b/dev/fd/3

例子:

[root@04 fd]# exec 3< /etc/resolv.conf
[root@04 fd]# cat /dev/fd/3
search example.com 

nameserver 10.10.10.10
nameserver 20.20.20.20

read您可以使用命令读取数据

[root@04 fd]# read -u 3 a b
[root@04 fd]# echo $a $b
nameserver 10.10.10.10

/dev/fd目录输出

[root@04 fd]# ls -l /dev/fd/
total 0
lrwx------ 1 root root 64 Feb 20 14:34 0 -> /dev/pts/0
lrwx------ 1 root root 64 Feb 20 14:34 1 -> /dev/pts/0
lrwx------ 1 root root 64 Feb 20 14:34 2 -> /dev/pts/0
lr-x------ 1 root root 64 Feb 20 14:34 3 -> /etc/resolv.conf

注意:在您的情况下,输入文件可能不同

于 2013-02-20T19:04:37.950 回答