在 zsh 中使用集群失败,但在 bash 中可以使用?

在 zsh 中使用集群失败,但在 bash 中可以使用?

使用答案中的机制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

zshbash尽管两个阵营之间做出了一些努力,试图越过栅栏窥视并窃取彼此的想法,但情况并非如此。另外,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
)

相关内容