Bash-функция, принимающая входные данные от параметра или трубы

Эта ошибка упоминается в списке рассылки .

Исправление состоит в том, чтобы отредактировать файл 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 .

9
05.08.2016, 08:28
2 ответа

Ответ Sundeep работает для base64, потому что эта утилита не поддерживает несколько строк. Более общее исправление для более общего случая

что-то вроде

my_function() {
    if (( ${#} == 0 )) ; then
        while read -r line ; do
            target_utility "${line}"
        done
    else
        target_utility "${@}"
    fi
}
5
27.01.2020, 20:05

Люди говорят о том, как base64 --decodeможет быть на самом деле заполнитель для более сложной команды — возможно, конвейер или составная команда — но никто ничего с этим не делает  (*). Ну, вот не -рекурсивное решение в котором основные команды появляются только один раз:

b64decode() {
        if [ "$#" -ne 0 ]
        then
                printf '%s\n' "$1"
        else
                cat
        fi | base64 --decode
        echo
} 

Логика довольно проста:

  • Если есть аргумент, запишите его на стандартный вывод.
    • (printfбезопаснее, чем echo.)
    • В вопросе не сказано, что делать, если есть два или более аргумента, поэтому я игнорирую этот случай.
  • Если нет, запустите cat.
    • Одинокий кот не бесполезен. UUOC обычно характеризуются наличием только одного аргумента имени файла; у этого нет. Соединяет вход с функцией (который является вводом оператора if)к выходу оператора if(, который является входом для оператора base64 –decode), очень похоже на catв этот немного похожий ответ .

Но у некоторых людей аллергия на кошек, поэтому вот кошачья -бесплатная версия:

b64decode() {
    (
        if [ "$#" -ne 0 ]
        then
                exec <<< "$1"
        fi
        base64 --decode
        echo
    )
}
  • Здесь используется строка -, поэтому она работает в bash, и думаю будет работать в кш (кш93 и выше ), мкш и зш, но он не будет работать в других оболочках, совместимых с POSIX -.
  • Логика аналогична первой версии — если есть аргумент, перенаправить стандартный ввод на строку -аргумента, поэтому base64увидит его как стандартный ввод.
  • В противном случае ничего не делайте (оставьте стандартный ввод в покое ).
  • Если пользователь говорит b64decode < file.txt, что (, очевидно, )устанавливает стандартный ввод для b64decodeбыть файлом file.txt. Но, если мы делаем любую форму exec <, который устанавливает стандартный ввод для всей оболочки в глобальном масштабе. Итак, после того, как base64прочитал строку -здесь, оболочка получит конец -файла -(EOF )и завершит работу. Итак, мы запускаем всю функцию в подоболочке. Конечно, это означает, что код обработки не может делать ничего, что меняет среду оболочки.

_______________
(*)За исключением kbulgrien, который обработал это с помощью рекурсивного кода , что мне кажется неуместным.

4
02.09.2020, 00:43

Теги

Похожие вопросы