我正在设计一个复杂的 ArchLinux 脚本,它将安装 ArchLinux 并自动配置系统以进行正确安装。该脚本可以安装带有子卷的BTRFS并配置SystemdBoot,这就是问题所在。
基本上,我需要脚本能够检索根子卷的 ID 和名称,以便脚本正确配置 SystemdBoot。
我已经知道需要什么命令来获取此信息,即btrfs su li /
.但是,我只想检索根子卷的值并将它们保存为变量RootSubvolID
,并且RootSubvolName
我可以分别在我的脚本中的这一行使用它。
if [ "$use_btrfs" = "yes" ]; then
root_flags="${root_flags} rootflags=subvolid=[RootSubvolID],subvol=[RootSubvolName]"
fi
答案1
如果您可以保证子卷的名称不会以空格开头并且不会包含换行符,您可以这样做:
if
name=$(
LC_ALL=C btrfs sub show / |
LC_ALL=C grep -aPom1 '^\s*Name:\s*\K\S.*'
) &&
id=$(
LC_ALL=C btrfs sub show / |
LC_ALL=C grep -aPom1 '^\s*Subvolume ID:\s*\K\d+$'
)
then
do-something-with "$name" and "$id"
else
echo >&2 "Can't determine name and/or id"
fi
对于子卷 ID,您还可以使用:
id=$(btrfs inspect-internal rootid /)
面对不寻常的子卷名称,这可能更可靠。
或者,您可以从挂载表获取信息,假设名称不包含,
字符:
IFS=,
set -o noglob
for o in $(findmnt -no options -M /)
case $o in
subvolid=*) id=${o#*=};;
subvol=*) name=${o#*=};;
esac
done
请注意名称中的某些字符可能会表示为\xHH
序列。