我想知道如何在协程中使用嵌套变量。例如,我可以通过以下方式正常使用嵌套变量。
$ a=b
$ b=lol
$ echo ${!a}
lol
但我不能为协同进程执行此操作,至少在 shell 脚本中:
$ coproc a { while :;do echo lol;done; }
[1] 15827
$ b=a
$ read test <&${!b[0]}
$ echo $test
lol
这行得通,但这
#!/bin/bash
send_message() { echo "$2">$1; }
question() {
TARGET="$1"
echo "Why hello there.
Would you like some tea (y/n)?"
read answer
[[ $answer =~ ^([yY][eE][sS]|[yY])$ ]] && echo "OK then, here you go: http://www.rivertea.com/blog/wp-content/uploads/2013/12/Green-Tea.jpg" || echo "OK then."
until [ "$SUCCESS" = "y" ] ;do
send_keyboard "$TARGET" "Do you like Music?" "Yass!" "No"
read answer
case $answer in
'Yass!') echo "Goody!";SUCCESS=y;;
'No') echo "Well that's weird";SUCCESS=y;;
*) SUCCESS=n;;
esac
done
}
startproc() {
local copname="$1"
local TARGET="$2"
coproc $copname { question "$TARGET" 2>&1; }
outproc "$copname" "$TARGET"
}
inproc() {
local coproc="$1"
shift
echo "$@" >&"${!coproc[1]}"
}
outproc() {
local coproc="$1"
local TARGET="$2"
while read -t 1 -u "${!coproc[0]}" line; do send_message "$TARGET" "$line"; done
}
startproc a test
inproc a y
才不是:
~ $ bash -vx t.sh
#!/bin/bash
send_message() { echo "$2">$1; }
question() {
TARGET="$1"
echo "Why hello there.
Would you like some tea (y/n)?"
read answer
[[ $answer =~ ^([yY][eE][sS]|[yY])$ ]] && echo "OK then, here you go: http://www.rivertea.com/blog/wp-content/uploads/2013/12/Green-Tea.jpg" || echo "OK then."
until [ "$SUCCESS" = "y" ] ;do
send_keyboard "$TARGET" "Do you like Music?" "Yass!" "No"
read answer
case $answer in
'Yass!') echo "Goody!";SUCCESS=y;;
'No') echo "Well that's weird";SUCCESS=y;;
*) SUCCESS=n;;
esac
done
}
startproc() {
local copname="$1"
local TARGET="$2"
coproc $copname { question "$TARGET" 2>&1; }
outproc "$copname" "$TARGET"
}
inproc() {
local coproc="$1"
shift
echo "$@" >&"${!coproc[1]}"
}
outproc() {
local coproc="$1"
local TARGET="$2"
while read -t 1 -u "${!coproc[0]}" line; do send_message "$TARGET" "$line"; done
}
startproc a test
+ startproc a test
+ local copname=a
+ local TARGET=test
+ outproc a test
+ local coproc=a
+ local TARGET=test
+ read -t 1 -u '' line
t.sh: line 34: read: : invalid file descriptor specificationinproc a y
+ inproc a y
+ local coproc=a
+ shift
+ echo y
t.sh: line 28: "${!coproc[1]}": Bad file descriptor
~ $ + question test
~ $
提前致谢。