【问题标题】:Sh script not moving file after it is created "${path}/${file}"sh脚本创建后不移动文件“${path}/${file}”
【发布时间】:2022-01-22 19:53:03
【问题描述】:

用于将创建的文件复制到已挂载的软盘上的 sh 脚本在文件创建后不会移动它。

文件“diskplayer.contents”被写入/home/pi/diskplayer/tmp,然后这个脚本应该将它移动到“/media/pi/Floppy Disk/”

监视 diskplayer.contents 文件,然后将其移动到挂载的软盘

#!/bin/sh
# /etc/init.d/copyfiles.sh
### BEGIN INIT INFO
# Provides:          copyfiles.sh
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Copies file to the floppy
# Description:       Copies specific file from tmp folder to the mounted floppy once created
### END INIT INFO

inotifywait -m /home/pi/diskplayer/tmp -e create @__init__.py |
    while read path action file; do
        if [ "$file" = "diskplayer.contents" ]; then
            sudo chown root:root "${path}/${file}"
            sudo chmod 777 "${path}/${file}"
            sudo mv "${path}/${file}" /media/pi/Floppy Disk/diskplayer.contents
        fi
    done

我试过sudo mv "${path}/${file}" /media/floppy/diskplayer.contents 只是想看看它是否会移动到那个文件夹,即使软盘没有安装在那里并且它仍然无法工作

【问题讨论】:

  • 如果它在启动时作为初始化脚本运行,那么它已经是 root。不需要任何sudo 调用。您是否完全确定软盘在运行时已安装?也许您需要另一个 Required-Start 依赖项。
  • Floppy Disk 你这里真的有不加引号的空格吗?
  • @Fravadona 是的,那是我的软盘驱动器的安装位置。我也尝试过使用没有空间的不同文件夹的脚本,但它仍然不起作用。
  • 我们看不到您运行的任何其他脚本,因此我们无法告诉您其中有什么问题,但您发布的脚本无法正常工作 - 请阅读 mywiki.wooledge.org/Quotesmywiki.wooledge.org/BashFAQ/001然后将/media/pi/Floppy Disk/diskplayer.contents 更改为'/media/pi/Floppy Disk/diskplayer.contents' 并将while read 更改为while read -r,然后如果您仍有问题,请告诉我们。

标签: python linux bash script


【解决方案1】:
sudo mv "${path}/${file}" /media/pi/Floppy Disk/diskplayer.contents

Shell 通过空格分割命令参数。所以这相当于:

sudo mv "${path}/${file}" "/media/pi/Floppy" "Disk/diskplayer.contents"

将“${path}/${file}”和“/media/pi/Floppy”移动到“Disk/diskplayer.contents”

这可能会产生某种错误。您的 init 脚本是否记录在某处?

#!/bin/sh

我强烈建议您使用 -e 调用非交互式 shell,以便错误状态代码终止脚本。继续处理出错的脚本很少有任何意义,而让整个脚本立即失败是在 shell 中执行此操作的最简单方法。

inotifywait -m /home/pi/diskplayer/tmp -e create @__init__.py ...

我个人会为此联系 inotifyd - 独立的系统守护程序,它可以在文件或路径被修改时调用您的脚本。它将简化您的 shell 脚本,并让您更容易独立于等式的 init 侧测试您的 shell 脚本。

【讨论】:

  • shell -e errexit 是一个不一致的陷阱。它可能会以有时难以追踪的意想不到的方式中断。更好地处理脚本中的错误情况。
  • @LéaGris 扩展您的评论,BashFAQ/105 有一篇文章
猜你喜欢
  • 1970-01-01
  • 2021-08-26
  • 2020-08-31
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多