小编Zol*_*tan的帖子

cmd_drain < <(cmd_src) 和 cmd_drain <<< "$(cmd_src)" 之间有区别吗?

cmd | read -r var1 var2众所周知,该构造在 bash 中不起作用,因为由于管道,读取命令在子 shell 中执行。我曾经用来read -r var1 var2 <<< "$(cmd)"解决这个问题,但最近我了解了这个cmd_drain < <(cmd_src)结构,它似乎也能正常工作:read -r var1 var2 < <$(cmd).

这两种解决方案有区别吗?虽然目前没有似乎是在平凡的情况下,任何的区别:

$ hd < <(echo Hello)
00000000  48 65 6c 6c 6f 0a                                 |Hello.|
00000006
$ hd <<< $(echo Hello)
00000000  48 65 6c 6c 6f 0a                                 |Hello.|
00000006
Run Code Online (Sandbox Code Playgroud)

我还尝试了一些特殊字符并得到了相同的结果。我的直觉是,结果总是相同的,即在cmd_drain <<< "$(cmd_src)"cmd_src整个结果提供给它之前首先运行并在内存中缓冲整个结果cmd_drain,同时cmd_drain < <(cmd_src)将继续提供cmd_srcinto的输出cmd_drain。我认为它像cmd_src | cmd_drain …

bash

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

如果预先知道其输入的大小,如何跟踪管道中命令的进度?

我想使用pv. 这个操作的输入的大小是预先知道的,但它的输出的大小不是。这迫使我将pv操作放在管道的左侧。

问题是长时间运行的命令会因为缓冲而立即消耗其全部输入。这有点类似于关闭管道中的缓冲问题,但在我的情况下,它是消耗操作缓慢,而不是生成一个,并且在这种情况下,另一个问题的答案似乎都不起作用。

这是一个演示问题的简单示例:

seq 20 | pv -l -s 20 | while read line; do sleep 1; done
  20 0:00:00 [13.8k/s] [=====================================>] 100%
Run Code Online (Sandbox Code Playgroud)

进度条不是每秒更新一次,而是立即跳转到 100% 并在处理输入所需的整个 20 秒内保持在那里。pv如果行被逐行处理,则只能测量进度,但最后一个命令的整个输入似乎被读入缓冲区。

一个稍长一些的示例也演示了未知数量的输出行:

#! /bin/bash
limit=10
seq 20 | \
  pv -l -s 20 | \
  while read num
do
  sleep 1
  if [ $num -gt $limit ]
  then
    echo $num
  fi
done
Run Code Online (Sandbox Code Playgroud)

有关解决方法的任何建议?谢谢!

shell bash pipe pv

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

标签 统计

bash ×2

pipe ×1

pv ×1

shell ×1