Ell*_*LLC 3 command-line bash scripts
我需要补充:
user_xattr,acl,barrier=1
Run Code Online (Sandbox Code Playgroud)
到我的 /etc/fstab 文件。有没有办法通过 via shell 脚本来做到这一点?
我只想编辑“ /”挂载。
这是我手动编辑之前的内容:
UUID=eb287d10-60a8-4a9a-9148-5f907fc7a8be / ext4 errors=remount-ro 0 1
Run Code Online (Sandbox Code Playgroud)
这是我手动添加行后的样子:
UUID=eb287d10-60a8-4a9a-9148-5f907fc7a8be / ext4 user_xattr,acl,barrier=1,errors=remount-ro 0 1
Run Code Online (Sandbox Code Playgroud)
我知道该sed -i命令在这里不起作用,因为它只会添加行...
脚本也可以在多台计算机上运行,因此它必须能够“知道”UUID 会有所不同。
ter*_*don 12
实际上,sed可以很好地工作,但这里还有更多选择:
sudo sed -i.old -r '/[ \t]\/[ \t]/{s/(ext4[\t ]*)([^\t ]*)/\1\2,user_xattr,acl,barrier=1/}' /etc/fstab
Run Code Online (Sandbox Code Playgroud)
-i.old:就地编辑文件并fstab.old在更改前创建原始文件的备份。-r : 启用扩展正则表达式。 /[ \t]\/[ \t]/{}: 如果该行匹配一个/由空格或制表符包围的 a(如果该行描述了/挂载点)。s/(ext4[\t ]*)([^\t ]*)/\1\2,user_xattr,acl,barrier=1/:s/pat/replacement/是替换运算符,它将替换pat为replacement. 在这里,我们正在匹配ext4任何后面的空格或制表符(需要锚定匹配,如果您的文件系统不是 ext4,您需要更改它)然后捕获(这就是括号所做的)最长的一段非-之后的空白字符。换句话说,捕获 fstab 的选项字段。然后我们将它们替换为\1(第一个捕获的模式),\2(第三个捕获模式,原始选项)加上您想要添加的额外选项。sudo perl -i.old -pane 's/$F[3]/$F[3],user_xattr,acl,barrier=1/ if $F[1] eq "/"' /etc/fstab
Run Code Online (Sandbox Code Playgroud)
-i.old:同样,这将导致文件被就地编辑并fstab.old创建一个名为的备份。-pane:-p表示打印每一行,-a自动将输入行拆分为空白区域,并将它们保存为数组@F。-n意味着逐行读取并-e让您在命令行上传递脚本。$F[3],第1场$F[0]),仅在第二ffield($F[1]中,挂载点)/。sudo cp /etc/fstab /etc/fstab.old &&
awk '($2=="/"){$4=$4",user_xattr,acl,barrier=1"}1;' /etc/fstab.old | sudo tee /etc/fstab
Run Code Online (Sandbox Code Playgroud)
大多数版本awk不允许就地编辑,因此第一个命令将创建一个备份副本。然后awk将检查第二个字段是否是/,如果是,则将所需的文本添加到第四个字段,即选项。该1;是AWK简写“打印行”。这sudo tee只是一个允许打印的技巧,/etc/fstab因为简单的重定向不适用于sudo.
sudo cp /etc/fstab /etc.fstab.old
while read fs mp ty op du pa; do
[[ $mp = "/" ]] && op="user_xattr,acl,barrier=1,""$op";
printf "%s %s %s %s %s %s\n" "$fs" "$mp" "$ty" "$op" "$du" "$pa";
done < /etc/fstab.old | sudo tee /etc/fstab
Run Code Online (Sandbox Code Playgroud)
while read fs mp ty op du pa; do ...; done < /etc/fstab : 读取每个 fstab 行并拆分为相关字段。[[ $mp = "/" ]] && op="user_xattr,acl,barrier=1,""$op";如果挂载点是/,则将额外选项添加到$op.printf刚刚正确打印的每一行。