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

时间:2016-05-31 21:36:07

标签: bash pipe file-descriptor

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

问题在于,在下面的代码片段中," 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

1 个答案:

答案 0 :(得分:2)

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: %q\n" "$a1" "$a2"' \
  <"$tempdir/pipe" 3>&- &
printf '%s\n' "$@" >&3
wait