#!/usr/bin/env bash
auth() {
exec 3<<AUTH
$1
$2
AUTH
}
auth test pwd
sh -c 'cat <&3'
我想将凭据临时存储在格式为 的身份验证文件/内存中user/npass
,一旦被 读取,就必须将其删除<&3
。读取它的二进制文件在带有 bash5+ 的 docker alpine 容器中无限运行,并在环境中执行/bin/sh
,因此像这样的子 shellcat <(echo -e "$1\n$2")
不起作用,并且在命令结束后删除临时文件是没有选择的。
上面的代码可以工作,但我不喜欢这里文档没有缩进的外观。我知道我可以使用真正的制表符,<<-EOF
但这最终会出现在公共存储库中,并且即使某些编辑器用 4 个空格替换制表符也必须起作用,所以我不能依赖它。
是否有一种替代方法可以echo $user>$3
将输出放入(echo -e "$1\n$2")
fd 中?
<&3
无论我尝试什么,我要么以输入阻塞并等待 EOF结束,要么以 fd 内容没有被删除而告终。
提前致谢!
答案1
从这是否是一个好的实践、你想要做什么来抽象出来,这是一个。
#!/usr/bin/env bash
auth() {
exec 3< <(printf "%s\n%s\n" "$1" "$2")
}
auth test pwd
sh -c 'cat <&3'
结果,正如预期的那样:
$ ./auth.bash
test
pwd
答案2
FWIW,你总是可以这样做:
auth() {
exec 3<<< "$1"$'\n'"$2"
}
或者:
auth() {
eval $'exec 3<< EOF\n$1\n$2\nEOF'
}
不确定这对易读性有多大帮助。
5.1 之前的 Bash 版本对此处文档或此处字符串使用已删除的临时文件,自 5.1 起,对短内容使用管道,对不适合管道的内容使用已删除的临时文件。
这意味着在较新的版本中,数据只能从 fd 3 读取一次(无法倒回 ( lseek()
),并且无法通过打开 再次从头开始读取/proc/self/fd/3
)