在不使用here-doc的情况下将多行写入文件描述符,并在读取

在不使用here-doc的情况下将多行写入文件描述符,并在读取
#!/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

相关内容