bash:在只读根分区上使用 read

bash:在只读根分区上使用 read

巧合的是,我不得不使用我的 ATA-ID-to-device-name 脚本(可在此处找到:https://serverfault.com/questions/244944/linux-ata-errors-translated-to-a-device-name/426561#426561)在一个只读 /分割。如果你好奇的话,它是一个 Ubuntu 恢复控制台,它可以让你访问你的/分区,但默认情况下会将其挂载为只读。我对此感到很高兴,因为否则我可能永远不会发现我的脚本由于某一特定行而在 R/O 系统上表现得很奇怪,这一行是:

IFS=: read HostMain HostMid HostSub <<< "$HostFull"

这确实不是如果没有写权限则工作。但我不会认为它会失败。但显然<<<运营商需要将一些临时文件写入某处。

但是有没有办法避免临时文件的创建,或者有没有办法指定文件的写入位置?在 Ubuntu 恢复控制台中,奇怪的是,该/run目录具有写入权限,因此,如果我能以某种方式“告诉”read将临时文件写入到平常以外的其他位置,那么就可以了。

答案1

数组可以在不需要临时文件的情况下进行字符串解析。不要忘记关闭通配符。

set -f
IFS=: Hosts=($HostFull)
HostMain=${Hosts[0]}
HostMid=${Hosts[1]}
HostSub=${Hosts[2]}
set +f

答案2

我同意@gniourf_gniourf,您可能需要写访问权限,但不需要文件描述符,很可能是文件。

您可以通过跟踪命令在只读分区中的执行情况来测试这一点。

{ strace -p "$$" & sleep 1; read var1 <<< "hi"; sleep 1; kill "$1"; }

上面的代码将strace在 Bash shell 上运行(进程$$)。然后它会休眠 1 秒,然后read从 HERE STRING 运行。我已经把绳子"hi"放在这个位置了。然后我又sleep等了一秒钟,kill然后strace

例子

解析此输出时,您会注意到文件被打开为O_WRONLY,用于写入文件。

open("/tmp/sh-thd-4137571604", O_WRONLY|O_CREAT|O_EXCL|O_TRUNC, 0600) = 3

在上面我们可以看到您的命令序列正在写入哪个文件。

答案3

我发现位置参数对于此类任务非常有用。它通常也可以移植到所有 shell,并且不需要分叉或临时文件。

$ HostFull=main:mid:sub    
$ oldIFS=$IFS; IFS=:; set -- $HostFull; IFS=$oldIFS
$ echo $1
main
$ echo $2
mid
$ echo $3
sub

相关内容