Questions tagged «file-descriptors»

2
&6和/ dev / fd / 6有什么区别?
要读取文件描述符6,我可以使用<&6或</dev/fd/6(aka /proc/self/fd/6)。通常两者都可以很好地工作。但是,如果该文件描述符恰好是套接字,则会发生奇怪的事情。例如: $ bash -c 'ls -l /dev/fd/6;cat /dev/fd/6' 6</dev/tcp/localhost/12345 lrwx------ 1 michas michas 64 Jan 10 19:50 /dev/fd/6 -> socket:[315010] cat: /dev/fd/6: No such device or address 这里ls显示描述符确实存在。但是用这种方式不可能访问数据。如果我cat <&6改用其他方法,一切都会再次正常。 两种访问文件描述符的方式有什么区别? 如果数字在变量中给出,是否有访问描述符的好方法?(</dev/fd/$fd可以,但<&$fd不能。) (以上情况在Linux上可以观察到,但在OpenBSD上则不能观察到。-似乎文件描述符在那里是常规字符设备。)

4
程序输出重定向
当尝试使用“大于”的语法(例如foo 2> myfile)重定向程序输出时,此处可能出现的数字是什么,它们代表什么? 我相信1是/dev/stdout,2是/dev/stderr。5和6呢?有3、4或大于6的数字吗?

2
在ssh -t上的stderr
这会将输出发送到STDERR,但不会传播Ctrl+ C(即Ctrl+ C将杀死ssh但不会杀死remote sleep): $ ssh localhost 'sleep 100;echo foo ">&2"' 这会传播Ctrl+ C(即Ctrl+ C将杀死ssh并远程sleep发送),但会将STDERR发送到STDOUT: $ ssh -tt localhost 'sleep 100;echo foo ">&2"' 在仍然传播Ctrl+的同时,如何强制第二个将STDERR输出发送到STDERR C? 背景 GNU Parallel使用'ssh -tt'来传播Ctrl+ C。这样可以杀死远程运行的作业。但是发送到STDERR的数据应在接收端继续发送到STDERR。

2
具有流程替代的输出订单
这是我通常在文件上运行grep而wc无需扫描两次的工作 <file.txt tee >(grep LITERAL) >(wc -l) >/dev/null 但是,这产生了 EXEC LITERAL 32 有时和 32 EXEC LITERAL 在其他时间。(第一个实例的输出grep先wc于,第二个实例的反之亦然。) 另一方面,带有重定向和文件描述符 { { <file.txt tee /dev/fd/3 | grep LITERAL >&4; } 3>&1 | wc -l ;} 4>&1 我总是似乎得到 EXEC LITERAL 32 我更喜欢输出顺序是可预测的,但是第二种方法可以保证吗?

2
为什么进程替换<()与ssh -F不兼容
我有一些无所事事的虚拟机。要登录他们,我发出vagrant ssh命令。我想使用常规ssh命令登录。的vagrant ssh-config输出合适的配置文件 $ vagrant ssh-config Host default HostName 127.0.0.1 User vagrant Port 2201 UserKnownHostsFile /dev/null StrictHostKeyChecking no PasswordAuthentication no IdentityFile /home/cbliard/.vagrant.d/insecure_private_key IdentitiesOnly yes LogLevel FATAL 在文件中输出此配置并与配合使用时ssh -F,一切正常: $ vagrant ssh-config &gt; /tmp/config $ ssh -F /tmp/config default =&gt; logged successfully 使用进程替换运算符&lt;(cmd)阻止创建临时配置文件时,它将失败: $ ssh -F &lt;(vagrant ssh-config) default Can't open …


3
命名管道,文件描述符和EOF
两个窗口,同一用户,带有bash提示。在window-1中输入: $ mkfifo f; exec &lt;f 因此,bash现在正尝试从文件描述符0中读取文件,该文件描述符0映射到命名管道f。在window-2中输入: $ echo ls &gt; f 现在window-1打印一个ls,然后外壳消失。为什么? 下一个实验:使用再次打开window-1 exec &lt;f。在window-2中输入: $ exec 3&gt;f $ echo ls &gt;&amp;3 在上面的第一行之后,window-1唤醒并显示提示。为什么?在上面的第二行之后,window-1打印ls输出,并且shell保持活动状态。为什么?实际上,现在在window-2中,echo ls &gt; f不会关闭window-1外壳。 答案必须与window-2中引用命名管道的文件描述符3 的存在有关!

1
OS X,bash:较少用于打开文件描述符,而cat不
在我正在使用的bash脚本中(必须在Ubuntu和OS X上运行),我需要将数百个命令的输出重定向到文件。 与其附加&amp;&gt;...到所有这些,不如做 exec 9&gt;&amp;1 exec 5&lt;&gt;/tmp/some-file.txt exec 1&gt;&amp;5 到目前为止,一切顺利,但是在所有这些命令的中间,我需要读取到目前为止已编写的所有内容,同时保持文件描述符处于打开状态。 现在,在Ubuntu上,我可以做 cat /dev/fd/5 要么 tee &lt;/dev/fd/5 但是在OS X上,什么也没打印(命令立即退出)。 但是,使用lessI可以看到两者的文件内容。 我可以通过使用以下命令来达到上述效果(在两个操作系统上均有效) less /dev/fd/5 | tee 但这似乎是一个hack。 那么,为什么less显然可以看到catOS X上无法显示的内容?(或者所有BSD后代都受到影响吗?) 还是我做错了什么?

4
为什么我不能`tail -f / proc / $ pid / fd / 1`?
我写了一个简单的脚本echo-es其PID: #/bin/bash while true; do echo $$; sleep 0.5; done 我3844在一个终端上运行上述脚本(反复说),并尝试在另一终端上运行tail文件描述符: $ tail -f /proc/3844/fd/1 它不会在屏幕上打印任何内容,并挂起直到^c。为什么? 另外,所有STD文件描述符(IN / OUT / ERR)都链接到相同的点: $ ls -l /proc/3844/fd/ total 0 lrwx------ 1 mg mg 64 sie 29 13:42 0 -&gt; /dev/pts/14 lrwx------ 1 mg mg 64 sie 29 13:42 1 -&gt; /dev/pts/14 lrwx------ …

2
在远程活动终端中执行命令
假设您打开了一个终端仿真器(T1),其PID为6350。 在另一个终端上,键入以下命令(C1): echo "ls\n" &gt; /proc/6350/fd/0 这会ls在T1中写入新行,但不会执行它。为什么? 我也尝试使用cat|bashwith,echo "ls\n" &gt; /proc/catid/fd/0但仍未执行。 如何将命令回显到另一个终端并执行命令? 可能的答案: $ mkfifo toto; $ bash &lt; toto; $ echo "ls" &gt; toto; 在这种情况下,您不能再直接在终端中写入(所有显示的内容都与命令(C1)在该终端中显示内容的方式相同。

3
写入流程的标准输入
据我了解,如果我输入以下内容... python -i ... python解释器现在将从stdin读取,行为(显然)是这样的: &gt;&gt;&gt; print "Hello" Hello 如果执行此操作,我希望它会执行相同的操作: echo 'print "Hello"' &gt; /proc/$(pidof python)/fd/0 但这是输出(蜂鸣器实际空行): &gt;&gt;&gt; print "Hello" &lt;empyline&gt; 在我看来,它只是将print "Hello"\n并写入 stdout,却没有解释。为什么这样不起作用,我必须怎么做才能使其起作用?

2
在管道中使用脚本时如何读取用户输入
一般问题 我想编写一个与用户交互的脚本,即使该脚本位于管道链的中间。 具体例子 具体来说,它用file或来stdin显示行(带有行号),要求用户输入选择或行号,然后将相应的行打印到stdout。我们将此脚本称为selector。然后,基本上,我希望能够 grep abc foo | selector &gt; myfile.tmp 如果foo包含 blabcbla foo abc bar quux xyzzy abc 然后selector向我展示(在终端上,而不是在myfile.tmp!中)带有选项 1) blabcbla 2) foo abc bar 3) xyzzy abc Select options: 之后我输入 2-3 并以 foo abc bar xyzzy abc 作为的内容myfile.tmp。 我已经启动并运行了一个选择器脚本,如果我不重定向输入和输出,则基本上可以正常运行。所以 selector foo 表现得像我想要的。但是,当像上面的示例中那样将内容管道在一起时,selector将显示的选项打印到myfile.tmp并尝试从grepped输入中读取选择。 我的方法 我尝试使用的-u标志read,如 exec 4&lt; /proc/$PPID/fd/0 exec …

2
在Bash中,文件描述符255的作用是什么,我可以使用它吗?
我了解文件描述符(或文件处理程序)是Linux系统中的文件IO技术。 我也知道每个进程都有3个标准流(即stdin,stdout和stderr),这些流由描述符从0到3的文件表示。 但是,我注意到我检查过的所有进程lsof -p &lt;pid&gt;都有一个255具有读取许可权的额外文件描述符。 从这个答案中,我了解到此功能特定于Bash shell,但是答案和所引用的源都没有真正解释此文件描述符的用途。 我的问题: 255文件描述符的作用是什么? 我可以在我的Bash脚本中使用它吗,或者它只是一个内部工作机制,不应该手动使用/操纵?

2
文件描述符和派生
当孩子被分叉时,它会继承父对象的文件描述符,如果孩子关闭了文件描述符,将会发生什么?如果孩子开始写文件,那么在父母的末端文件将如何处理?谁来管理这些不一致,内核还是用户? 当进程调用该close函数以通过文件描述符关闭特定打开的文件时。在进程的文件表中,引用计数减一。但是由于父级和子级都持有同一个文件,因此引用计数为2,关闭后该引用计数减少为1。由于它不是零,因此该进程仍然可以继续使用文件而没有任何问题。 请参阅Terrence Chan UNIX系统编程,(Unix内核对Files的支持)。

1
“文件描述符”中“描述符”的词源
选择单词描述符总是使我感到奇怪。“索引”或“ id”似乎更明显。选择“描述符”一词有已知的理由吗? 我猜想“描述符”在概念上比在数字上更关键,但有时它实际上是在数字上,因此猜测似乎很微弱。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.