Answers:
显式调用Shell。
flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) > ~/counter.txt'
请注意,您更改的任何变量都是该Shell实例的本地变量。例如,该COUNTER
变量将不会在调用脚本中更新:您必须从文件中读回它(但同时它可能已更改),或者作为命令的输出:
new_counter=$(flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) | tee ~/counter.txt')
该flock
工具使用起来有些棘手,手册页也很短。手册页提供了三种使用该工具的方式:
flock [options] <file|directory> <command> [command args]
flock [options] <file|directory> -c <command>
flock [options] <file descriptor number>
这个问题的措辞方式我一定会使用的第三种形式flock
。如果在手册页中进一步介绍了flock
一些示例,这些示例显示了使用第三种形式的确切语法:
#!/bin/bash
(
flock -n 9 || exit 1
echo "commands executed under lock..."
echo "go here..."
) 9>/tmp/mylockfile
我添加了#!/bin/bash
。
我已成功使用的这种形式flock
。