如何让bash在管道输入场景下逐行处理交互式输入?
如何让bash在管道输入场景下逐行处理交互式输入?
这个情况我太熟了!bash在管道输入的场景下,默认会开启块缓冲模式,不会一收到一行输入就立刻处理,得等你输入完所有内容(按^D结束输入)才会一次性执行所有命令,确实挺闹心的。给你几个亲测好用的解决办法:
方法1:用while read循环逐行执行
把管道输出交给while循环处理,每读一行就执行对应的命令,完美解决缓冲问题:
sed 's/.*/wget &/g' | while read -r cmd; do eval "$cmd"; done
你现在再粘一个链接按回车,对应的wget命令会立刻启动,不用等全部输入完。
方法2:用stdbuf强制bash使用行缓冲
如果想保留直接管道给bash的方式,可以用stdbuf命令关闭bash的块缓冲,强制它逐行读取输入:
sed 's/.*/wget &/g' | stdbuf -i0 -o0 -e0 bash -i
这里-i0是关闭输入缓冲,-o0和-e0分别关闭输出和错误输出的缓冲,这样bash就会实时处理每一行输入了。
方法3:简化流程,直接在循环里处理URL
其实完全可以省掉sed那一步,直接在while循环里调用wget,更直观也更少出错:
while read -r url; do wget "$url"; done
你直接粘贴网址按回车,马上就会触发对应的下载任务,整个流程更简洁。
我自己平时用方法3最多,步骤少还不容易出问题,你可以挨个试试,选最顺手的就行!
备注:内容来源于stack exchange,提问作者iago-lito
相关产品推荐
相关产品推荐

