小编Kon*_*eak的帖子

破折号:按定义的顺序将 STDIN 输送到多个命令,并将它们的输出输送到 STDOUT

起初我认为这个答案是解决方案,但现在我认为我需要一个临时文件作为缓冲区。

这不可靠:

#!/bin/sh
echo 'OK' |
{
    {
        tee /dev/fd/3 | head --bytes=1 >&4
    } 3>&1 | tail --bytes=+2 >&4
} 4>&1
Run Code Online (Sandbox Code Playgroud)

当我在终端中运行它时,有时我会得到:

好的

有时我会得到:

ķ
Ø

似乎完全随机。因此,作为一种解决方法,我将 的输出写入tail文件并stdout在管道完成后将其读回。

#!/bin/sh
echo 'OK' |
{
    {
        tee /dev/fd/3 | head --bytes=1 >&4
    } 3>&1 | tail --bytes=+2 >file
} 4>&1
cat file
Run Code Online (Sandbox Code Playgroud)

这可以在dash没有临时文件的情况下完成吗?Shell 变量作为缓冲区也不是一个选项,因为输出可能包含 NUL 字节。

pipe io-redirection dash file-descriptors tee

6
推荐指数
1
解决办法
902
查看次数

破折号:如何捕获陷阱的输出(不带参数调用)?

在本节trap中的破折号手册页出现如下提示:

不带任何参数的trap导致它以适合作为 shell 输入的格式信号列表及其相关操作写入标准输出,以实现相同的捕获结果

惊人的!我以为我找到了一种简单的方法来恢复我已经覆盖的以前的信号处理程序,方法是将trap的输出作为命令返回给 shell:

trap "echo 'good'" EXIT

# save signal handlers to $traps
traps="$(trap)"

# override EXIT handler
trap "echo 'bad'" EXIT

# reinstate original handlers
eval "$traps"
Run Code Online (Sandbox Code Playgroud)

期望的输出: good

实际输出: bad

这是完全合乎逻辑的,因为它$traps是空的,这又与联机帮助页一致:

当 shell 分叉出一个子 shell 时,它会将被捕获(但不会被忽略)的信号重置为默认操作。

(命令替换$(trap)分叉出一个子shell,所以trap不知道任何信号处理程序。)


一切似乎都按其应有的方式行事。但是如何利用trap的列表功能呢?

dash trap

5
推荐指数
1
解决办法
412
查看次数

标签 统计

dash ×2

file-descriptors ×1

io-redirection ×1

pipe ×1

tee ×1

trap ×1