bash 文件描述符 - 脚本无法按预期工作



所以在我的脚本中,我调用其他需要 2 行的脚本作为 init 参数。

问题是在下面的代码片段中,"script.sh"只占第一行(arg1)。它似乎对第二行(arg2)没有任何用处

fun () {
    arg1="init argument one"
    arg2="init argument two"
    local PIPE=$(mktemp -u)
    mkfifo $PIPE
    eval "exec 3<>${PIPE}"
    rm $PIPE
    ./script.sh <&3 &
    echo "$arg1">&3
    echo "$arg2">&3
}
fun

此外,当我删除最后一个echo时,脚本的行为相同

fun () {
    arg1="init argument one"
    arg2="init argument two"
    local PIPE=$(mktemp -u)
    mkfifo $PIPE
    eval "exec 3<>${PIPE}"
    rm $PIPE
    ./script.sh <&3 &
    echo "$arg1">&3
}
fun

FIFO 有两面,每个文件描述符仅附加到一面。即使使用 O_RDWR 打开也是如此,就像您使用<>运算符所做的那样;您实际上无法从单个 FD 读取和写入;这只是一种获取写入句柄而不阻止读取器附加的方法。

因此,必须为读取器启动单独的 FD,管道才能正常工作。在使用至少两个参数运行时,观察以下脚本的行为:

#!/bin/bash
# mktemp -u is insecure; better to use mktemp -d and create fifo w/in
# see the EXIT trap for automatic tempfile cleanup
trap 'rm -rf "$tempdir"' EXIT
tempdir=$(mktemp -d pipeline.XXXXXX)
mkfifo "$tempdir/pipe"
exec 3<>"$tempdir/pipe"
bash -c 'read -r a1; read -r a2; printf "Read: %qn" "$a1" "$a2"' 
  <"$tempdir/pipe" 3>&- &
printf '%sn' "$@" >&3
wait

相关内容

  • 没有找到相关文章

最新更新