【问题标题】:Wait Until Previous Command Completes等到上一个命令完成
【发布时间】:2021-03-14 15:18:21
【问题描述】:

我在我的 MacMini 上编写了一个 bash 脚本,以便在文件下载完成时执行。文件下载完成后,mac挂载我的NAS,重命名文件,然后将文件从mac复制到NAS,从mac删除文件,然后卸载NAS。

我的问题是,有时,NAS 需要几秒钟才能安装。发生这种情况时,我收到一条错误消息,指出文件不存在,因为该目录不存在。

当 NAS 立即挂载时,(如果文件很小),文件复制,然后文件删除,NAS 卸载。

当文件很大时,删除文件时复制过程停止。

我要找的是,如何让脚本“等待”直到挂载 NAS,然后如何让脚本再次等到文件复制完成?

感谢您的任何意见。下面是我的代码。

#connect to NAS
open 'smb://username:password@ip_address_of_NAS/folder_for_files'

#I WANT A WAIT COMMAND HERE SO THAT SCRIPT DOES NOT CONTINUE UNTIL NAS IS MOUNTED

#move to folder where files are downloaded
cd /Users/account/Downloads

#rename files and copy to server
for f in *; do
    newName="${f/)*/)}";
    mv "$f"/*.zip "$newName".zip;
    cp "$newName".zip /Volumes/folder_for_files/"$newName".zip;
    
    #I NEED SCRIPT TO WAIT HERE UNTIL FILE HAS COMPLETED ITS TRANSFER

    rm -r "$f";
done

#unmount drive
diskutil unmount /Volumes/folder_for_files

【问题讨论】:

  • 我想知道为什么它还没有等到复制完成。
  • 您可以尝试在cp之后添加sync;sync;sync

标签: linux bash macos shell script


【解决方案1】:

我不再有 mac 可以尝试这个,但似乎 open 'smb://...' 是这里唯一不等待完成的命令,而是在后台执行实际工作。

解决此问题的最佳方法是使用open 以外的其他方式安装 NAS 驱动器。根据this answer,以下应该可以工作,但由于缺少mac和NAS,我无法对其进行测试。

# replace `open ...` with this
osascript <<< 'mount volume "smb://username:password@ip_address_of_NAS"'

如果这不起作用,请使用此解决方法,手动等待挂载 NAS。

open 'smb://username:password@ip_address_of_NAS/folder_for_files'
while [ ! -d /Volumes/folder_for_files/ ]; do sleep 0.1; done
# rest of the script

【讨论】:

  • 正要发布此内容,但带有until 循环。此外,使用一些 samba 实用程序可能还有更好的方法,但这绝对可以。
  • 谢谢! while 循环结束了工作。但由于某种原因,脚本在开始复制文件后继续运行;因此,由于终端正在使用驱动器,卸载会引发错误。所以我为卸载添加了另一个while循环以继续尝试直到它完成,然后将文件的删除放在之后,一切正常。非常感谢。
【解决方案2】:

例如,您可以使用循环休眠,然后运行五秒钟,然后运行smbstatus,如果输出包含任何字符串来识别您的smb://username:password@ip_address_of_NAS/folder_for_files 连接` 当找到它时,然后开始复制您的文件。您还可以设置一个计数器变量来停止,经过一定次数的睡眠,然后检查连接是否也成功。

【讨论】:

    猜你喜欢
    • 2016-01-07
    • 1970-01-01
    • 2011-02-19
    • 2015-07-05
    • 1970-01-01
    • 2011-10-20
    • 2012-07-19
    • 2019-02-03
    • 2021-06-09
    相关资源
    最近更新 更多