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