Ваша непосредственная проблема заключается в том, что одинарные кавычки предотвращают любое расширение оболочки.Вам нужны двойные кавычки для любого расширения.Тем не менее, вы не можете просто написать emacs --eval "(ediff \"$1\" \"$2\")"
, потому что имена файлов не будут правильно заключены в кавычки для Emacs, поэтому ваш скрипт сломается, если имена файлов будут содержать "
или \
.
К счастью,очень простое решение:
emacs --eval '(ediff command-line-args-left)' "$@"
Было бы лучше повторно использовать существующий процесс Emacs, если он есть, путем вызова emacsclient
.К сожалению, в Emacsclient --eval
обрабатывает все свои аргументы как выражения Lisp.Так что вам нужно сделать цитату внутри оболочки.В bash или ksh вы можете использовать ${VARIABLE//PATTERN/REPLACEMENT}
для добавления обратной косой черты перед двойными кавычками и обратной косой чертой;это немного больно, но это работает.
quoted1=${1//\\/\\\\}; quoted1=${quoted1//\"/\\\"}
quoted2=${2//\\/\\\\}; quoted2=${quoted2//\"/\\\"}
emacsclient -a '' --eval "(ediff \"$quoted1\" \"$quoted2\")"