小编bei*_*ei2的帖子

读取循环时只执行一次Shell脚本

我正在编写一个shell脚本,通过Handbrake批量处理.mov文件,以节省高清空间.该脚本使用"find"搜索目录,然后在找到的每个.mov文件上运行Handbrake,将生成的文件的创建日期与源文件的日期匹配为"touch".

我最初使用for循环执行此操作:

for i in $(find "$*" -iname '*.mov') ; do
  ~/Unix/HandbrakeCLI --input "$i" --output "$i".mp4 --preset="Normal"
  touch -r "$i" "$i".mp4
done
Run Code Online (Sandbox Code Playgroud)

这有效,但如果输入文件的文件名中有空格,则会失败.所以我尝试了一个while循环:

find "$*" -iname '*.mov' | while read i ; do
  ~/Unix/HandbrakeCLI --input "$i" --output "$i".mp4 --preset="Normal"
  touch -r "$i" "$i".mp4
done
Run Code Online (Sandbox Code Playgroud)

这个循环的问题是它适用于目录中的第一个文件,然后退出循环.请注意,如果我在while循环体中替换"echo $ i",它会打印目录中的所有.mov文件,因此循环结构正确.

我相信我对这个stackoverflow线程的问题有部分答案.但该解决方案特定于ssh,并不能解决一般问题.似乎与子进程使用的stdin有关,但我不完全理解它是如何工作的.

有什么建议?

我在OSX 10.6上

shell loops for-loop while-loop

8
推荐指数
1
解决办法
7951
查看次数

是否可以输出和监视标准输入、标准输出和标准错误以外的流?(Python)

这是一个 python 问题,也是一个 linux/BSD 问题。

我有一个带有两个线程的 python 脚本,一个从 Web 下载数据,另一个通过串行端口将数据发送到设备。这两个线程都使用 python 的logging模块将大量状态信息打印到标准输出。

我想要的是并排打开两个终端窗口,并让每个终端窗口显示一个线程的输出,而不是将来自两个线程的消息交错在一个窗口中。

除了标准输入、标准输出和标准错误之外,还有其他文件描述符可以写入并连接到其他终端窗口吗?也许这个愿望最好用 GUI 来实现?

我不知道如何开始。

编辑:我尝试将状态消息写入两个不同的文件,而不是将它们打印到标准输出,然后tail -f在其他终端窗口中监视这两个文件,但这不适用于实时监视,因为文件直到你打电话close()给他们。

python linux macos terminal stdout

6
推荐指数
1
解决办法
343
查看次数

标签 统计

for-loop ×1

linux ×1

loops ×1

macos ×1

python ×1

shell ×1

stdout ×1

terminal ×1

while-loop ×1