我知道您可以创建一个文件描述符并将输出重定向到它。例如
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)
我正在寻找一个很好的例子,说明何时必须使用额外的文件描述符。
我不太明白计算机是如何读取这个命令的。
cat file1 file2 1> file.txt 2>&1
如果我理解,2>&1只需将标准错误重定向到标准输出。
按照这种逻辑,该命令对我来说如下:
连接文件file1和file2.
stdout从此操作发送到file.txt.
发送stderr到stdout.
结尾?
我不确定电脑在做什么。按照我的逻辑,命令应该是
cat file1 file2 2>&1 > file.txt
但这不正确。
我很难理解如何在 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情况下使用它会使其更快,但我无法理解。我将不胜感激任何指向体面教程的链接。我的谷歌权力似乎让我失望。
我有一个 CRONTAB 条目,如下所示。有人能告诉我下面的语句到底在做什么吗?
1 0 * * * /vol01/sites/provisioning/MNMS/45627/45627.sh1 >> /vol01/sites/provisioning/MNMS/45627/output/cron.log 2>&1
Run Code Online (Sandbox Code Playgroud) 我一直在试图弄清楚文件描述符之间的关系。我不明白的一件事是,如何:
ls -l /bin/usr > ls-output.txt 2>&1
Run Code Online (Sandbox Code Playgroud)
不同于:
ls -l /bin/usr 2>&1 >ls-output.txt
Run Code Online (Sandbox Code Playgroud)