AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 567440
Accepted
user395294
user395294
Asked: 2020-02-14 09:16:22 +0800 CST2020-02-14 09:16:22 +0800 CST 2020-02-14 09:16:22 +0800 CST

Kindle e-ink 帮助 - 显示随机图像文件

  • 772

我对此完全是新手,但我正在尝试将其他人的代码改编为越狱的 Kindle 3(电子阅读器)。

我正在使用以下代码生成一个介于 0 到 X 之间的随机(ish)数字(其中 X 是我拥有的图像数量,目前为 33),这样我就可以每隔这么多小时(目前每 2 小时)显示一个随机图像)cron用于运行脚本。

#generate random number between my 33 images (compatible with busybox)
n=32
while [ $n -ge 32 ]; do
n=1$(</dev/urandom tr -dc 0-9 | dd bs=5 count=1 2>/dev/null)
n=$((n-100000))
done
ImageNumber=$n

#My images are numbered as follows - pic_0.png, pic_1.png, pic_3.png... etc
SelectedImage=$( find /mnt/us/timelit/images/pic_${ImageNumber}*.png)

# clear the screen
eips -c

# show that image
eips -g $SelectedImage

它正在工作,但是有几件事需要解决。

1)我认为脚本的随机数生成器部分存在问题,因为它在生成数字之前随时间变化(见下面的日志)

14:00:02: Script started
14:02:43: Random number is 2 
14:02:44: Image shown is pic_2.png 
15:00:02: Script started
15:00:19: Random number is 18 
15:00:20: Image shown is pic_18.png 
16:00:01: Script started
16:02:44: Random number is 10 
16:02:45: Image shown is pic_10.png  

2) Kindle 时不时地显示一个空白屏幕,而不是其中一个图像。我猜测生成的随机数存在问题,这意味着找不到具有匹配数字的 PNG,因此 Kindle 显示为空白。

任何帮助是极大的赞赏。

shell busybox
  • 2 2 个回答
  • 123 Views

2 个回答

  • Voted
  1. Best Answer
    frostschutz
    2020-02-14T10:29:09+08:002020-02-14T10:29:09+08:00
    #generate random number between my 33 images (compatible with busybox)
    n=32
    while [ $n -ge 32 ]; do
    n=1$(</dev/urandom tr -dc 0-9 | dd bs=5 count=1 2>/dev/null)
    n=$((n-100000))
    done
    ImageNumber=$n
    

    所以在这里你正在生成一个随机数 00000-99999 并且只有在它低于 32 时才会终止。100'000 中的概率为 32。如果前导 0 被解释为八进制数,它甚至可能导致无效的算术表达式问题。(编辑:哦,我想这就是你在前面加上 1 的原因)

    无论哪种方式...都需要一段时间才能终止。并提出了为什么你不只使用$RANDOM%32. 对于较小的数字$RANDOM(仅限于 0-32767)可以正常工作。

    如果$RANDOMKindle 的busybox 中没有(如果可能CONFIG_ASH_RANDOM_SUPPORT=n),您可以使用 ... 抓取一个数字,tr或者hexdump如果它可用,则直接使用它。

    在任何情况下,while 循环都是非常低效且毫无意义的。

    没有循环的例子:

    random=1$(</dev/urandom tr -dc 0-9 | dd bs=5 count=1 2>/dev/null)
    ImageNumber=$(($random % 32))
    

    仍然有点低效,因为tr必须读取比您想要的 5 个更多的随机字节(256 个机会中的 10 个读取一个数字)。

    如果可用(hexdump读取固定的 3 个随机字节):

     random=0x$(hexdump -v -e '3/1 "%02x"' -n 3 /dev/urandom)
     ImageNumber=$(($random % 32))
    
    #My images are numbered as follows - pic_0.png, pic_1.png, pic_3.png... etc
    SelectedImage=$( find /mnt/us/timelit/images/pic_${ImageNumber}*.png)
    

    如果您的 ImageNumber 为 1,则该表达式转换为pic_1*.pngwhich could be pic_1.pngbut also pic_10-19.png,pic-100-199.png依此类推。如果文件名中没有多余的字符,请去掉 *. 否则,您需要另一个分隔符pic_${ImageNumber}_*.png(以允许文件名如pic_1_spaceship.png)。

    无论哪种方式,您都可以跳过查找并直接使用表达式:

    eips -g /mnt/us/timelit/images/pic_${ImageNumber}.png
    
    • 1
  2. Gilles 'SO- stop being evil'
    2020-02-14T11:31:33+08:002020-02-14T11:31:33+08:00

    请参阅frostschutz 的回答,了解您的代码为何无法正常运行。我将给出不同的解决方案。

    如果您的 BusyBox 环境包含 awk,则更简单的方法是生成一个足以满足此应用程序的随机数

    awk -v n=32 'BEGIN {srand(); print int(rand() * n); exit}'
    

    srand()仅基于四舍五入到最接近秒的当前时间,因此在许多情况下它是不合适的(任何与安全相关的情况,任何每秒可能有超过一次随机抽取的情况)。但这里已经足够好了。

    与其为每张图片分配一个数字并硬编码数字范围,不如列出文件并随机选择一个。更确切地说:

    • 将位置参数设置为文件列表。
    • 使用 awk 随机选择一个位置参数。
    • 在位置参数中选择该文件名。
    set -- /mnt/us/timelit/images/pic*.png
    i=$(awk -v n=$# 'BEGIN {srand(); print int(rand() * n ) + 1; exit}')
    eval "SelectedImage=\${$i}"
    
    eips -c
    eips -g $SelectedImage
    

    您甚至可以让 awk 直接选择图像文件,但如果文件很多,您可能会遇到命令行长度限制。

    SelectedImage=$(awk '
        BEGIN {srand(); print ARGV[int(rand() * (length(ARGV)-1) + 1)]; exit}
      ' /mnt/us/timelit/images/pic*.png)
    

    (请注意,如果您有一个更完整的 bash 和 GNU 实用程序环境,那么会有更简单的方法来做一些事情。我的回答坚持每个 POSIX shell 和许多 BusyBox 安装中可用的功能。)

    • 1

相关问题

  • 这个命令是如何工作的?mkfifo /tmp/f; 猫/tmp/f | /bin/sh -i 2>&1 | 数控 -l 1234 > /tmp/f

  • FreeBSD 的 sh:列出函数

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • grep -v grep 有什么作用

  • 如何将带有〜的路径保存到变量中?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve