![在 zsh 中使用集群失败,但在 bash 中可以使用?](https://linux22.com/image/140599/%E5%9C%A8%20zsh%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E9%9B%86%E7%BE%A4%E5%A4%B1%E8%B4%A5%EF%BC%8C%E4%BD%86%E5%9C%A8%20bash%20%E4%B8%AD%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%EF%BC%9F.png)
使用答案中的机制https://unix.stackexchange.com/a/274499/5132在 Z 外壳中:
(
flock -x 200
echo "test";
) 200>mylockfile2
回报
zsh: parse error near `200'
在 bash 中它可以正常工作。这里可能有什么问题?
答案1
Bash 是唯一允许用户使用普通重定向语法直接打开大于 9 的 fd 的 shell。所以在其他 shell 中该命令相当于(...) 200 1>mylockfile2
,这是一个语法错误。 posix 仅强制要求支持 0-9。如果您确实想确保与锁一起使用的 fd 尚未被使用,您可以使用专门设计的语法来打开下一个可用的 fd。
(foo "$lockfd";...) {lockfd}>file
答案2
zsh
bash
尽管两个阵营之间做出了一些努力,试图越过栅栏窥视并窃取彼此的想法,但情况并非如此。另外,flock
似乎来自util-linux
这样的可移植性可能会受到限制。 ZSH 解决方案可能会使用该zsystem
模块;该模块提供了一个flock
命令:
#!/usr/bin/env zsh
zmodload zsh/system
(
local lockvar
touch lockfile
zsystem flock -f lockvar lockfile
print >&2 got lock
sleep 10
zsystem flock -u $lockvar
print >&2 end lock
)