我是一名Bash初学者,但我正在努力学习这个工具,以便将来在计算机领域找到一份工作。
现在我正在尝试自学文件描述符。让我分享一些我的实验:
#!/bin/bash
# Some dummy multi-line content
read -d '' colours <<- 'EOF'
red
green
blue
EOF
# File descriptor 3 produces colours
exec 3< <(echo "$colours")
# File descriptor 4 filters colours
exec 4> >(grep --color=never green)
# File descriptor 5 is an unlimited supply of violet
exec 5< <(yes violet)
echo Reading colours from file descriptor 3...
cat <&3
echo ... done.
echo Reading colours from file descriptor 3 again...
cat <&3
echo ... done.
echo Filtering colours through file descriptor 4...
echo "$colours" >&4
echo ... done. # Race condition?
echo Dipping into some violet...
head <&5
echo ... done.
echo Dipping into some more violet...
head <&5
echo ... done.
看到上面的输出,我的脑海中浮现出一些问题:
- fd3 在“使用”后似乎会被“耗尽”,那么它是否在第一次使用后自动关闭?
- fd3 和命名管道有什么不同?(我已经查过一些资料)
yes
命令究竟是在何时开始执行的?在 fd 声明时还是之后?yes
会在需要更多输入时停止(CTRL-Z
或其他),然后重新启动吗?- 我如何获取
yes
的 PID? - 我能否获取“活动”fd的列表?
- 过滤通过 fd4 的竞争条件非常有趣,能否避免这种情况发生?
yes
只有在我使用exec 5>&-
命令后才会停止吗?- 使用
>&-
关闭与使用<&-
是否有关系?
暂时就问到这里,谢谢!
PS:部分(编号)回答没问题...我会自己整理。 (虽然一个人给出全面的答案会很印象深刻!)
cat
关闭了,啊哈!exec 3< <(while true; do date '+%H-%M-%S' | tee -a /tmp/log; sleep 1; done); tail -f /tmp/log
wait
!!sleep 5 & pid=$!; echo before; wait $pid; echo after
- 太棒了!令人印象深刻的答案!!谢谢!!/tmp/log
文件达到约48千字节时,它就被阻塞了。仅使用“date '+%H-%M-%S'”仍然会发生,只是需要更长时间 :-) - Celada