【问题标题】:Display output of command in terminal while using command substitution使用命令替换时在终端中显示命令输出
【发布时间】:2019-05-30 21:23:42
【问题描述】:

所以我正在尝试检查命令的输出,但我也希望能够直接在终端中显示输出。

#!/bin/bash
while :
do
OUT=$(streamlink -o "$NAME" "$STREAM" best)
echo "$OUT"
if [[ $OUT == *"No playable streams"* ]]; then
  echo "Delaying!"
  sleep 15s
fi
done

这就是我试图做的。

代码检查命令的输出是否包含错误子字符串,如果是,则会增加延迟。这部分效果很好。

但是当命令实际成功下载文件时它不能正常工作,因为在下载完成之前它不会执行回显(这需要几个小时)。所以在那之前我无法亲自检查命令的输出

加上这个特定命令的输出会实时显示和更新速度和文件大小,这是 echo 无法复制的。

那么有没有办法能够实时显示命令的输出,同时也可以用命令替换它们以便在命令完成后检查子字符串的输出?

【问题讨论】:

    标签: bash command-substitution streamlink


    【解决方案1】:

    使用临时文件:

    TEMP=$(mktemp) || exit 1
    
    while true
    do
        streamlink -o "$NAME" "$STREAM" best |& tee "$TEMP"
        OUT=$( cat "$TEMP" )
        #echo "$OUT" # not longer needed
        if [[ $OUT == *"No playable streams"* ]]; then
            echo "Delaying!"
            sleep 15s
        fi
    done
    
    # not really needed here because of endless loop
    rm -f "$TEMP"
    

    【讨论】:

    • 输出为[cli][info]: command not found 表示$OUT=$( cat "$TEMP" ) 行你知道为什么吗?
    • 好的,我正在做一些快速的实验。 TEMP=$(mktemp); streamlink "$STREAM" |& tee "$TEMP"; cat "$TEMP" 没有输出任何错误,但是TEMP=$(mktemp); streamlink "$STREAM" |& tee "$TEMP"; $OUT=$( cat "$TEMP" ); echo $OUT 输出 =: command not found in the end
    • 该死我是个白痴,我想通了,它应该是没有“$”的 OUT=$( cat "$TEMP" )
    • 好的,还有一个问题:该命令似乎无法显示实时进度(下载速度、文件大小等)。有没有办法解决这个问题?
    • 如果 stdout 未连接到终端,某些工具(如 grep)使用块缓冲而不是行缓冲进行输出。 grep --line-buffered 修复它。我不知道streamlink 是否也有这样的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    相关资源
    最近更新 更多