所以在我的脚本中,我调用其他需要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
答案 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