Invoque um shell explicitamente.
flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) > ~/counter.txt'
Observe que qualquer variável que você altera é local para essa instância do shell. Por exemplo, a variável COUNTER
não será atualizada no script de chamada: você terá que lê-la de volta a partir do arquivo (mas pode ter mudado nesse meio tempo) ou como saída do comando:
new_counter=$(flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) | tee ~/counter.txt')