如何在Bash中编写循环,在CTRL + C上打破?

时间:2013-11-23 17:33:51

标签: linux bash loops break

我试过这段代码:

ls | while read file; do mpg123 "$file" || break; done

但是当我按 CTRL + C 时,它会播放下一首歌曲。我怎样才能打破 CTRL + C

2 个答案:

答案 0 :(得分:3)

您的问题是当您按 ctrl-c SIGINT)时,mpg123是抓住它的那个,并返回状态为0,所以你的shell不会收到信号,所以它不会中止循环。

你可以按 ctrl-c 直到播放停止以突破循环。

或使用其他玩家。例如,mplayer似乎在 ctrl-c 上以状态1退出,因此应该可以正常工作。

也就是说,您可以使用xargs

以更优雅的方式重写命令
ls | xargs -d '\n' -n 1 mplayer

答案 1 :(得分:1)

如果由于某种原因,您更喜欢使用while循环,例如你想要打印出文件名或以某种方式更改它,然后你可以通过先设置进程然后wait为它来使bash陷入SIGINT(Ctrl + C),现在wait将是一个捕获SIGINT而不是process

#!/bin/bash

find . -type f -print0 |
while read -r -d '' f; do
    echo "$f"
    process "$f" > "$f.processed" &
    wait $!
done

find -print0 read -d ''将支持带有换行符和其他内容的奇怪文件名,添加-maxdepth 1以查找是否要排除子目录)