Para completar, você pode contornar esse problema exclusivamente no shell:
for i in "$@"; do
pushd "$(dirname "$i")"
DIR='pwd'
FILES="\"$(basename "$i")\""
emacs -Q --batch \
--eval "(progn
(require 'org)(require 'org-table)
(mapc (lambda (file)
(find-file (expand-file-name file \"$DIR\"))
(org-table-map-tables 'org-table-align)
(write-file file nil)
(kill-buffer)) '($FILES)))"
popd
done
Isso muda para o diretório contido de cada arquivo e, em seguida, executa o comando emacs
existente nesse único arquivo por vez com um nome de caminho relativo e, em seguida, retorna.
Isso é ineficiente, há um monte de lugares onde isso vai dar errado (caminhos estranhos *, em particular, podem ser um problema quando embutidos no elisp), e certamente haverá uma solução melhor dentro do próprio emacs, mas funcionará tão bem quanto o seu roteiro original.
* Por exemplo, suponha que você tenha um arquivo chamado:
"
Isso fará com que seu script elisp seja um erro de sintaxe, porque as aspas serão incluídas textualmente e tratadas como fechando o literal da string. Se alguém pode controlar os nomes de arquivos que existem, eles poderiam construir um que executasse código arbitrário, mas mesmo sem isso as coisas podem se romper misteriosamente.