我有以下调用来创建命名管道:
mkfifo "$HOME/.quicklock/ql_named_pipe";
然后我从命名管道中读取:
while read line; do ql_on_named_pipe_msg "$line" "$$"; done < "$HOME/.quicklock/ql_named_pipe" &
但我收到此错误消息:
./scripts/tsc.sh:line 23:read:`/Users/alexamil/.quicklock/ql_named_pipe':不是有效的标识符
有谁知道为什么那不应该工作?
如果您仔细阅读评论,原来的代码看起来像是:
my_named_pipe="$HOME/.quicklock/ql_named_pipe"
…
while read $my_named_pipe
do
…
done < $my_named_pipe # This redirection not 100% clearly stated
这确实会导致错误“无效标识符”。 read
命令期望将变量名称作为参数。当给出$my_named_pipe
时,它看到:
while read /Users/whoever/.quicklock/ql_named_pipe
而且绝对不是有效的变量名。
正如self-answer所提出的,一个最合理的选择是:
while read line
do
…
done < $my_named_pipe
'大多数'是因为在POSIX read
中有sh
的问题 - 另见read
的Bash手册。你可能更喜欢使用read -r
(或者再次使用,也许你不会)。
不确定是什么问题,但这应该工作正常:
my_named_pipe="/some/path/on/your/fs/ql_named_pipe"
while read line; do ql_on_named_pipe_msg "$line" "$$"; done < ${my_named_pipe} &