巧合的是,我不得不使用我的 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