如果命令以某个字符串响应,如何让 bash 脚本停止?

如果命令以某个字符串响应,如何让 bash 脚本停止?

我想知道是否可以在 bash 脚本中添加一行代码,如果终端显示“加载失败”,它就会停止。

现在我有涉及 melt 的 bash 脚本来合并视频,但有时找不到视频,这会打乱整个过程。然后我必须手动向上滚动直到找到“加载失败”,有时它太高了,我再也找不到它了。

我想知道是否有办法,如果终端(或 melt)响应一行包含“加载失败”,脚本就会立即停止并且不会继续。或者,至少有一种方法可以将显示“加载失败”的行输出到 .txt 文件中。

答案1

你可以管道程序的标准输出被传递给另一个程序,后者在与特定模式匹配时退出。第一个程序应该当管道塌陷时终止。

为了显示:

$ { printf '%.0sOK\n' {1..10}; printf 'failed to load\n'; printf '%.0sOK\n' {1..10}; } | sed '/failed to load/q'
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
failed to load

如果failed to load消息写入标准错误流而不是标准输出流,则该方法可能需要调整:

somecommand 2>&1 | sed '/failed to woad/q'

前任。

melt "a/VID1.mkv" "a/VID2.mkv" -consumer avformat:/output/output.mkv acodec=libmp3lame vcodec=libx264 2>&1 | sed '/Failed to load/q'

如果命令是脚本的一部分,而你想在发生这种情况时退出脚本,那么至少使用 GNU sed 你可以告诉它使用特定的退出代码然后你可以测试并采取相应的行动。例如

melt "a/VID1.mkv" "a/VID2.mkv" -consumer avformat:/output/output.mkv acodec=libmp3lame vcodec=libx264 2>&1 | sed '/Failed to load/q3'

if [ $? -eq 3 ]; then
  echo "Aborting concatenation" >&2
  exit 3
fi

相关内容