Эта ошибка упоминается в списке рассылки .
Исправление состоит в том, чтобы отредактировать файл git-completion.zsh
и удалить параметр -Q
из compadd
в __ gitcomp_file
.
--- i/contrib/completion/git-completion.zsh
+++ w/contrib/completion/git-completion.zsh
@@ -90,7 +90,7 @@ __gitcomp_file ()
local IFS=$'\n'
compset -P '*[=:]'
- compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
+ compadd -p "${2-}" -f -- ${=1} && _ret=0
}
__git_zsh_bash_func ()
Этот файл устанавливается из каталога contrib / complete
, и его путь может отличаться в зависимости от вашего диспетчера пакетов. Если вы установили homebrew на macOS, он находится в /usr/local/Cellar/git/2.10.2/share/zsh/site-functions
.
Ответ Sundeep работает для base64
, потому что эта утилита не поддерживает несколько строк. Более общее исправление для более общего случая
что-то вроде
my_function() {
if (( ${#} == 0 )) ; then
while read -r line ; do
target_utility "${line}"
done
else
target_utility "${@}"
fi
}
Люди говорят о том, как base64 --decode
может быть на самом деле заполнитель для более сложной команды — возможно, конвейер или составная команда — но никто ничего с этим не делает (*). Ну, вот не -рекурсивное решение в котором основные команды появляются только один раз:
b64decode() {
if [ "$#" -ne 0 ]
then
printf '%s\n' "$1"
else
cat
fi | base64 --decode
echo
}
Логика довольно проста:
printf
безопаснее, чем echo
.)cat
. if
)к выходу оператора if
(, который является входом для оператора base64 –decode
), очень похоже на cat
в этот немного похожий ответ . Но у некоторых людей аллергия на кошек, поэтому вот кошачья -бесплатная версия:
b64decode() {
(
if [ "$#" -ne 0 ]
then
exec <<< "$1"
fi
base64 --decode
echo
)
}
base64
увидит его как стандартный ввод. b64decode < file.txt
, что (, очевидно, )устанавливает стандартный ввод для b64decode
быть файлом file.txt
. Но, если мы делаем любую форму exec <…
, который устанавливает стандартный ввод для всей оболочки в глобальном масштабе. Итак, после того, как base64
прочитал строку -здесь, оболочка получит конец -файла -(EOF )и завершит работу. Итак, мы запускаем всю функцию в подоболочке. Конечно, это означает, что код обработки не может делать ничего, что меняет среду оболочки. _______________
(*)За исключением kbulgrien, который обработал это с помощью рекурсивного кода , что мне кажется неуместным.