gpt4 book ai didi

shell - 在 POSIX sh 中,当输入是连续的(事件观察器)时,如何保留在 'while read' 循环中设置的变量?

转载 作者:行者123 更新时间:2023-12-04 15:24:41 25 4
gpt4 key购买 nike

如果不需要设置全局变量,或者愿意使用命名管道,可以使用:

$NAMED_PIPE="/tmp/mypipe"
mkfifo $NAMED_PIPE

command | # piped into while read, command can be an event watcher
while read -r foo bar; do
MY_VAR="$foo"
echo "$MY_VAR" # This works
echo "MY_VAR" > "$NAMED_PIPE" &
done

echo "$MY_VAR" # This doesn't work
cat "$NAMED_PIPE" # This works

如果需要设置全局变量,可以在bash中使用如下:

while read -r foo bar; do
MY_VAR="$foo"
echo "$MY_VAR" # This works
done < <(command) # command can be an event watcher

echo "$MY_VAR" # This works

在 POSIX sh 中,您可以执行以下操作,但它不适用于连续输入(似乎只是挂起):

while read -r foo bar; do
MY_VAR="$foo"
echo "$MY_VAR" # Works as long as command doesn't produce continuous output
done <<-EOF
$(command)
EOF

echo "$MY_VAR" # Works as long as command doesn't produce continuous output

是否有可靠的方法来解析 POSIX sh 中的事件观察器(例如 xev、xprop -spy)并能够设置全局变量?命名管道似乎很难便携和安全地使用。

最佳答案

命名管道是解决方案,但您用错了地方。

NAMED_PIPE="/tmp/mypipe"
mkfifo "$NAMED_PIPE"

command > "$NAMED_PIPE" &

while read -r foo bar; do
MY_VAR="$foo"
echo "$MY_VAR"
done < "$NAMED_PIPE"

echo "$MY_VAR"

关于shell - 在 POSIX sh 中,当输入是连续的(事件观察器)时,如何保留在 'while read' 循环中设置的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62513909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com