2

Employing the mechanism from the answer at https://unix.stackexchange.com/a/274499/5132 in the Z shell:

(
flock -x 200

echo "test";

) 200>mylockfile2

returns

zsh: parse error near `200'

While in bash it works correctly. What may be the issue here?

2 Answers 2

7

Bash is the only shell that allows the user to open a fd higher than 9 directly using the normal redirection syntax. so in other shells the command is equivalent to (...) 200 1>mylockfile2, which is a syntax error. posix only mandates supporting 0-9. If you really want to ensure the fd used with the lock isn't already in use, you can use syntax specifically designed to open the next available fd. (foo "$lockfd";...) {lockfd}>file

3
  • What does foo or lockfd refer to? Is lockfd a special variable? Commented Oct 14, 2018 at 15:52
  • foo is a arbitrary command, lockfd is just a arbitrary variable named used to store the fd number opened by {lockfd} Commented Oct 15, 2018 at 0:19
  • yash also supports 200> file. rc, es, akanga as well with the >[200] file syntax. Commented Jul 5, 2019 at 18:31
3

zsh is not bash despite some efforts between the two camps of peeking over the fence and stealing ideas from one another. Also, flock appears to come from util-linux so portability may be limited. A ZSH solution might instead use the zsystem module; this module provides a flock command:

#!/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
)
2
  • Why do you have the parentheses creating a sub shell? I could not think of a case where I would need them, the code seems to work just fine without the parentheses Commented Sep 9, 2021 at 21:55
  • @reportaman from the docs "The lock terminates when the shell process that created the lock exits; it is therefore often convenient to create file locks within subshells, since the lock is automatically released when the subshell exits." Commented Jun 1, 2022 at 21:17

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.