我一直在编写一个 bash 脚本来自动化通过 LUKS 外部硬盘打开和关闭 LVM 的过程。但是我在第 28 行继续收到错误:
$(vgchange -a n ; cryptsetup luksClose vol)
我收到的错误:
$ sudo ./encryption.sh -l
Locking System..............
./encryption.sh: line 28: 0: command not found
System Locked!
这是其余的代码供参考:
if [ $1 = -u ] ; then
$(cryptsetup luksOpen /dev/sdb2 vol)
echo "Unlocking.................." | pv -qL 10
$(mount /dev/mapper/vol-lvroot /mnt ; mount /dev/mapper/vol-lvvar /mnt/var ; mount /dev/mapper/vol-lvhome /mnt/home ; mount /dev/sdb1 /mnt/boot)
echo "System Mounted!" | pv -qL 10
# exit 0
fi
if [ $1 = -l ] ; then
$(umount /mnt/var ; umount /mnt/home ; umount /mnt/boot ; umount /mnt/)
echo "Locking System.............." | pv -qL 10
$(vgchange -a n ; cryptsetup luksClose vol)
echo "System Locked!" | pv -qL 10
exit 0
fi
其他信息:
当我以交互方式单独运行相关命令时,没有收到明显的错误。
我是编写 bash 的新手,所以任何建议和建设性的批评都是值得赞赏的。
该过程似乎成功完成,但我不明白错误或如何让它们消失。
经过进一步研究,当以交互模式单独运行有问题的代码时,它确实在执行后提供输出。
这是在交互式发布有问题的代码后给出的。
0 logical volume(s) in volume group "vol" now active
答案1
通过将命令放入$( .. )
块中,您可以进行命令替换。这意味着该块内的命令将被执行,并且这些命令的输出将被 bash 评估为要执行的其他命令。所以如果命令输出文本
0 logical volume(s) in volume group "vol" now active
然后 shell 将尝试将其作为命令运行,并在启动时0
查找具有该名称的命令。
为什么是你把命令放在$( .. )
块里了吗?你想用它来实现什么目的?