只是寻找之间的区别
2>&-2>/dev/null|&&>/dev/null>/dev/null 2>&1以及它们与非的Bourne shell喜欢便携性tcsh,mksh等等。
我知道您可以创建一个文件描述符并将输出重定向到它。例如
exec 3<> /tmp/foo # open fd 3.
echo a >&3 # write to it
exec 3>&- # close fd 3.
Run Code Online (Sandbox Code Playgroud)
但是你可以在没有文件描述符的情况下做同样的事情:
FILE=/tmp/foo
echo a > "$FILE"
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个很好的例子,说明何时必须使用额外的文件描述符。
我在脚本中看到了这一行:
DEVICE=`dialog --inputbox "Festplatten-Laufzeit auslesen. Gebe Sie das
gewünschte Device an: " 0 70 "" 3>&1 1>&2 2>&3`
Run Code Online (Sandbox Code Playgroud)
什么是
3>&1 1>&2 2>&3
Run Code Online (Sandbox Code Playgroud)
正在做?我知道 1 = stdout 和 2 = stderr,但是 the3和 the &for 是什么?
有时,我需要指定标准 IO 流 ( stdin, stdout, stderr)之一的“等效路径” 。因为我 99% 的时间都在使用 Linux,所以我只是/dev/在准备 get/dev/stdin等,而这“似乎做对了”。但是,一方面,我一直对这样的理由感到不安(因为,当然,“它似乎有效”,直到它没有为止)。此外,我对这种操作的便携性没有很好的了解。
所以我有几个问题:
在Linux中的情况下,它是安全(是/否)划上等号stdin,
stdout以及stderr用/dev/stdin,/dev/stdout和
/dev/stderr?
更一般地说,这个等价物是否“足够便携”?
我找不到任何 POSIX 参考。
$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty 136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim 64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
Run Code Online (Sandbox Code Playgroud)
/dev及其子目录下的所有文件都是设备的文件描述符?/dev/fd/0、
/dev/stdin、/proc/self/fd/0都是指向 的链接/dev/pts/2。lin lrwx------mean link,cincrw--w----
是什么意思?昨天我读了这个 SO 评论,它说在 shell 中(至少bash)>&-“与”具有相同的结果>/dev/null。
该评论实际上将 ABS 指南称为其信息来源。但该消息来源说>&-语法“关闭文件描述符”。
我不清楚关闭文件描述符和将其重定向到空设备这两个操作是否完全等效。所以我的问题是:是吗?
从表面上看,关闭描述符就像关闭一扇门,但将其重定向到空设备似乎打开了一扇通往地狱的大门!两者对我来说似乎并不完全相同,因为如果我看到一扇关着的门,我不会尝试从里面扔出任何东西,但是如果我看到一扇敞开的门,我会认为我可以。
换句话说,我一直想知道是否>/dev/null意味着cat mybigfile >/dev/null实际上会处理文件的每个字节并将其写入/dev/null忘记它。另一方面,如果 shell 遇到一个关闭的文件描述符,我倾向于认为(但我不确定)它不会写任何东西,尽管问题仍然是是否cat仍会读取每个字节。
这个评论说>&-和>/dev/null“应该”是一样的,但对我来说并不是那么响亮的答案。我想有一个更权威的答案,参考标准或源核心与否......
我不太明白计算机是如何读取这个命令的。
cat file1 file2 1> file.txt 2>&1
如果我理解,2>&1只需将标准错误重定向到标准输出。
按照这种逻辑,该命令对我来说如下:
连接文件file1和file2.
stdout从此操作发送到file.txt.
发送stderr到stdout.
结尾?
我不确定电脑在做什么。按照我的逻辑,命令应该是
cat file1 file2 2>&1 > file.txt
但这不正确。
我正在交互式 bash 会话中运行。我已经使用 exec 创建了一些文件描述符,我想列出我的 bash 会话的当前状态。
有没有办法列出当前打开的文件描述符?
我正在尝试安装389-ds,它给了我这个警告:
WARNING: There are only 1024 file descriptors (hard limit) available, which limit the number of simultaneous connections.
Run Code Online (Sandbox Code Playgroud)
我了解文件描述符,但我不了解软限制和硬限制。
当我跑cat /proc/sys/fs/file-max,我回来590432。这应该意味着我最多可以打开 590432 个文件(即最多有 590432 个文件描述符。
但是当我运行时ulimit,它给了我不同的结果:
$ ulimit
unlimited
$ ulimit -Hn # Hard limit
4096
$ ulimit -Sn # Soft limit
1024
Run Code Online (Sandbox Code Playgroud)
但是硬/软限制来自ulimit什么,它们与存储在的数字有什么关系/proc/sys/fs/file-max?
我很难理解如何在 shell 脚本中使用文件描述符。
我知道基础知识,例如
exec 5 > /tmp/foo
Run Code Online (Sandbox Code Playgroud)
所以 fd 5 附加到 foo 用于写入。
exec 6 < /tmp/bar
Run Code Online (Sandbox Code Playgroud)
……阅读。
exec 5>&-
Run Code Online (Sandbox Code Playgroud)
...关闭fd。
这有什么作用呢?
#!/bin/bash
exec 5 > /tmp/foo
exec 6 < /tmp/bar
cat <&6 | while read a
do
echo $a >&5
done
Run Code Online (Sandbox Code Playgroud)
据我所知,&5关闭了 fd,那么每次调用后输出仍然如何成功重定向?
这是复制意大利面来自:这里
它声称在简单的echo $a > file情况下使用它会使其更快,但我无法理解。我将不胜感激任何指向体面教程的链接。我的谷歌权力似乎让我失望。
file-descriptors ×10
bash ×5
shell ×5
linux ×3
portability ×2
command-line ×1
csh ×1
devices ×1
io ×1
open-files ×1
posix ×1
shell-script ×1
ulimit ×1