B 脚本的意外输出

B 脚本的意外输出

我编写了一个 bash 脚本来保存直播流中的图像。直播流 URL 是一个更新的 jpeg 文件,因此我编写了一个变量来根据纪元生成文件名。该脚本做了两件事,希望有人能帮我解释清楚。首先,使用 filename 变量保存的图像不能作为图像读取。

第二,有文件保存,但是名字不是我想要的。

脚本来源为:

#!/bin/bash

    while true; do
          date=`date +%s`
          ext=.jpg
          fname=$date$ext
          wget http://rawcam.ele.uri.edu/tmpfs/image.jpg -o $fname
          sleep 100
    done

and here is output:
$ ls
1489453852.jpg  1489453964.jpg  image.jpg    image.jpg.5  uri.sh
1489453951.jpg  1489453968.jpg  image.jpg.1  image.jpg.6
1489453954.jpg  1489453971.jpg  image.jpg.2  image.jpg.7
1489453958.jpg  1489453975.jpg  image.jpg.3  image.jpg.8
1489453961.jpg  1489453978.jpg  image.jpg.4  image.jpg.9

我做错了什么?我只想每隔几秒保存一次文件 image.jpg,文件名作为发生时的纪元。

答案1

正如@steeldriver 所解释的那样,输出文件的选项需要大写O。在脚本中处理文件名和其他字符串时,一般来说,最好将它们放在引号内以确保安全。这可以避免 shell 意外执行某些操作。修改后的脚本版本为:

#!/bin/bash

while true; do
      date=`date +%s`
      ext=".jpg"
      fname="$date$ext"
      wget http://rawcam.ele.uri.edu/tmpfs/image.jpg -O "$fname"
      sleep 100
done

当时发生的情况是,.jpg使用带有 的纪元来创建文件名,该文件名用作该wget命令运行的日志文件。wget它本身正在下载image.jpg文件,为了防止“破坏”* 之前的下载,在每个名称后添加了递增的数字,以 为单位.1

*clobbering 是指新文件覆盖具有相同名称的现有文件。

相关内容