当前位置: 首页 > 面试题库 >

Pipe Bash命令输出到stdout和变量

红存
2023-03-14
问题内容

我必须找到具有选定权限的文件,并列出它们及其编号。因此,我想将find命令的结果传递给shell和下一个命令,该输出我想存储在变量中,以便以后可以很好地显示。我想吃点东西

for i in "$@"
do
    find $filename -perm $i | tee /dev/tty | var=${wc -l}
    echo "number of files with $i permission: $var"
done

var=${wc -l}部分无效。请帮忙。

编辑 我知道我可以将命令的整个输出放到像这样的变量中

var=$(find $filename -perm $i | tee /dev/tty | wc -l)

但是然后我只需要的结果wc -l。我如何从该变量中获得该数字?是否可以按相反的顺序显示它,先显示编号,然后显示列表?


问题答案:

复制到TTY(不是标准输出!)

管道组件在子外壳程序中运行,因此,即使它们确实分配了外壳程序变量(并且语法不正确),这些外壳程序变量也会在管道退出时立即取消设置(因为子外壳程序的寿命与管道程序一样长)。

因此,您需要将 整个管道 的输出捕获到变量中:

var=$(find "$filename" -perm "$i" | tee /dev/tty | wc -l)

就个人而言,顺便说一句,我是tee荷兰国际集团,以/dev/stderr/dev/fd/2避免决策行为依赖于TTY是否可用。

实际管道到标准输出

使用bash 4.1,自动文件描述符分配使您可以执行以下操作:

exec {stdout_copy}>&1 # make the FD named in "$stdout_copy" a copy of FD 1

# tee over to "/dev/fd/$stdout_copy"
var=$(find "$filename" -perm "$i" | tee /dev/fd/"$stdout_copy" | wc -l)

exec {stdout_copy}>&- # close that copy previously created
echo "Captured value of var: $var"

对于较旧版本的bash,您需要自己分配FD-在以下示例中,我选择文件描述符编号3(因为0、1和2分别保留给stdin,stdout和stderr):

exec 3>&1  # make copy of stdout

# tee to that copy with FD 1 going to wc in the pipe
var=$(find "$filename" -perm "$i" | tee /dev/fd/3 | wc -l)

exec 3>&-  # close copy of stdout


 类似资料:
  • 我想将ffmpeg输出到一个rtmp流。同时,我想通过我的程序处理H264流。我已经尝试了"ffmpeg-f dshow-i video="Webcam C110"-vcodec libx264-f te-map 0: v"xx.mkv|-" 但不起作用。

  • 问题内容: 我正在尝试将命令输出重定向到变量: 然后阅读: 运行它时,输出如下: 但是变量保持空白。对于其他命令,我已经尝试过相同的方法,并且一切正常。 这会将文件列表写入变量,以便以后可以读取。我应该怎么做才能使其正常工作? 问题答案: 也许输出去了,不是吗? 尝试这个:

  • 和之前 inputs/stdin 插件一样,outputs/stdout 插件也是最基础和简单的输出插件。同样在这里简单介绍一下,作为输出插件的一个共性了解。 配置示例 output { stdout { codec => rubydebug workers => 2 } } 解释 输出插件统一具有一个参数是 workers。Logstash 为输

  • 问题内容: 我试图将命令输出也扔到文件加上控制台。这是因为我要在文件中保留输出记录。我正在执行以下操作,并将其追加到文件,但不在终端上打印输出。 问题答案: 是的,如果您重定向输出,它将不会出现在控制台上。使用。

  • 你好,我有一个bash脚本,我打算测量时间流逝,CPU%和内存使用的脚本与输出被放入一个. txt文件与所需的输出,如: 执行此操作的脚本如下所示: 然而,下载终端进度也被定向到. txt文件,即. txt文件。 我不熟悉使用stderr和stdout,所以我是否误解了它们,我将如何解决这个问题?

  • 问题内容: 我正在编写一个dockerfile,并希望将“ ls”命令的输出放入一个变量,如下所示: 在此,“ dir”内部只有一个文件。 dockerfile中的以下RUN指令不起作用 问题答案: 您不能保存变量供以后在其他命令中使用(如果您打算这样做)。这是因为每种情况都发生在新的外壳中。 但是,如果只想捕获输出,则应该可以在一个复合命令中完成它。例如: 或者只是使用subshel​​l内联: