我使用的是运行 Ubuntu 18.04.3 LTS Bionic Beaver 的持久实时 USB,因为硬盘分区非常困难。玩 Steam 游戏时,我需要一个交换文件。在以下机构的帮助下@malte-skoruppa,我现在在内部硬盘上的 NTFS 分区上使用交换文件。
我现在想使用我的第一个 Bash 脚本来自动化这个过程,基于如何操作。请问您能看出这个脚本有什么缺陷吗?:
#!/bin/bash
echo "Mounting partition..."
sudo mount -U 80EA3F58EA3F49A4 /media/ubuntu/LENOVO
echo "Opening swapfile..."
sudo swapon /media/ubuntu/LENOVO/swapfile.img
steam steam://open/minigameslist
echo "Closing swapfile..."
sudo swapoff /media/ubuntu/LENOVO/swapfile.img
echo "Unmounting partition..."
sudo umount -l /media/ubuntu/LENOVO
echo "Mission accomplished!"
我特别关心这个umount -l
选项。HOWTO 说一旦分区不忙,它就会卸载,但是一个旧的 Stack Overflow 答案说它强制卸载分区,这是不是我想做的事。
答案1
因为我知道您是 Ubuntu 新手,所以这里有一些一般性评论。
1. 将该分区放入/etc/fstab
首先,在您的脚本中,您使用该行sudo mount -U 80EA3F58EA3F49A4 /media/ubuntu/LENOVO
来挂载您的 NTFS 分区。我建议将该分区添加到您的分区/etc/fstab
并将其映射到那里的分区的 UID。由于您使用的是单用户系统,因此您可能希望在您的 中有类似这样的条目/etc/fstab
:
UUID=80EA3F58EA3F49A4 /media/ubuntu/LENOVO ntfs rw,exec,uid=1000,gid=1000,umask=0002,nls=utf8,noauto 0 0
最重要的是,这会告诉系统将挂载点绑定/media/ubuntu/LENOVO
到 UID 80EA3F58EA3F49A4
。这样,将来(因此在您的脚本中)您可以简单地使用sudo mount /media/ubuntu/LENOVO
而不是sudo mount -U 80EA3F58EA3F49A4 /media/ubuntu/LENOVO
。如果 UID 将来发生变化(因为您重新格式化分区),最好只有一个中心位置 来/etc/fstab
编辑,而不是可能有 20 个脚本。
这还会使用 NTFS 分区的各种常见选项挂载文件系统:读写模式 ( rw
)、允许执行二进制文件 ( exec
)、使文件系统上的所有文件和目录属于用户 1000 和组 1000 ( uid=1000,gid=1000
)(即您的普通用户)、将所有文件和目录的权限位设置为 775 ( umask=0002
)、将文件名的字符集设置为 UTF-8 ( nls=utf8
),并且不自动挂载分区 ( noauto
)。请参阅fstab(5)和安装(8)了解更多信息。我个人觉得在我的单用户系统上,无需使用 即可访问 NTFS 分区上的所有文件,这很方便sudo
,但当然您的情况可能会有所不同。
您可能还想删除该选项。然后,只要运行该命令,尤其是在启动时,noauto
分区就会被挂载(因此,它通常会一直挂载)。然后您甚至根本不需要在脚本中使用和命令,但我不知道您是否想要这样。mount -a
mount
umount
2. 不要umount
与-l
从卸载(8):
umount -l 的推荐用例是防止由于无法访问的网络共享而导致关机时挂起,而正常的 umount 会因服务器关闭或网络分区而挂起。
因此,至少在您的情况下,此选项不太常用。
umount
无论是否使用运行-l
,分区都不会被强制卸载(有此-f
选项)。相反,当您不使用-l
并且分区仍然繁忙时,卸载将失败并返回错误消息;当使用-l
并且分区仍然繁忙时,它将立即从文件系统层次结构中分离(意味着您无法再访问它),但待处理的 I/O 操作将在后台默默完成。
由于运行后不应该有任何待处理的 I/O 操作swapoff
,因此通过不使用,-l
您至少会注意到是否有异常,因为如果分区意外地仍然很忙,那么卸载命令将输出一条错误消息。
3.添加错误处理
您按顺序执行所有命令,但不检查前一个命令是否有效。因此,例如,如果安装失败,则swapon
仍将尝试执行该命令但失败,然后即使未激活交换,您的游戏也将开始。
尝试这个:
#!/bin/bash
echo "Mounting partition..."
sudo mount /media/ubuntu/LENOVO
if [ $? -ne 0 ]; then
echo "Could not mount partition, mission aborted." >&2
exit 1
fi
echo "Opening swapfile..."
sudo swapon /media/ubuntu/LENOVO/swapfile.img
if [ $? -ne 0 ]; then
echo "Could not activate swap, mission aborted." >&2
exit 1
fi
steam steam://open/minigameslist
echo "Closing swapfile..."
sudo swapoff /media/ubuntu/LENOVO/swapfile.img
echo "Unmounting partition..."
sudo umount /media/ubuntu/LENOVO
echo "Mission accomplished!"