Узкое решение проблемы: с Readlink
Поскольку вы работаете в Ubuntu (с GNU readlink), вы можете использовать readlink -e
, который ведет себя точно так же, как в надежде что realpath
предоставит:
git diff --name-only master... \
| xargs -d $'\n' readlink -e -- \
| xargs -d $'\n' someEditor
Поскольку вы работаете в Ubuntu, которая предоставляет GNU xargs, этот код будет правильно обрабатывать имена файлов с пробелами, буквенными кавычками или буквенными обратными слешами из-за использования -d $'\n'
на обоих xargs
вызовах.
Узкое решение проблемы: с Realpath
Если мы хотим придерживаться ваших существующих инструментов (то есть, realpath
вместо readlink
) и просто добавьте тест на существование, который может выглядеть следующим образом:
git diff --name-only master... \
| xargs -d $'\n' sh -c 'for f; do [ -e "$f" ] && realpath "$f"; done' _ \
| xargs -d $'\n' someEditor
Совет по реализации
Кстати, рассмотрите возможность инкапсуляции желаемой реализации в функцию оболочки в вашем ~/.bashrc
. Это может быть что-то вроде ...
forEachChangedFile {
local -a files
readarray -t files < <(
git diff --name-only "${branchExpr:-master...}" \
| xargs -d $'\n' readlink -e --
)
if (( $# )); then
"$@" "${files[@]}"
else
"${EDITOR:-someEditor}" "${files[@]}"
fi
}
... позже используется как:
forEachChangedClient vim
или
branchExpr=someBranch..someOtherBranch forEachChangedFile emacs-client
Преимущество не использования xargs
последний вызов редактора заключается в том, что он оставляет стандартный текст редактора, так что вы можете использовать его для редакторов, которые общаются с пользователем по этому каналу.