Как предотвратить вывод «фатальной» ошибки при использовании псевдонима команды git - PullRequest
0 голосов
/ 10 апреля 2020

Как я могу предотвратить вывод сообщения о фатальной ошибке? Я намерен создать псевдоним для нескольких команд git без STDOUT или STDERR. После добавления 2>&1 >/dev/null я продолжаю получать сообщения о фатальных ошибках при наложении псевдонимов команд.

enter image description here

Некоторые из команд имеют псевдоним z-shell (zsh) git плагин. В качестве части моего файла .zshr c я создаю псевдоним . zsh, в котором я сглаживаю, а затем повторно применяю псевдоним с новой командой.

Из псевдонимов. zsh

# -- Git related -------------------------------------------------- 
unalias grmci 2>&1 >/dev/null 
alias grmci 2>&1 >/dev/null || alias grmci="git rm --cached `git ls-files -i --exclude-from=.gitignore`" 2>&1 >/dev/null

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Если есть сомнения, используйте функцию вместо. Предполагая, что у вас есть GNU, а не BSD xargs:

# this runs not just on zsh, but also on ksh/bash/etc with GNU xargs.
# (would be POSIX-compliant but for $'\n' syntax for literal newlines)
grmci() {
  {
    git ls-files -i --exclude-from=.gitignore |
      xargs --no-run-if-empty -d $'\n' \
      git rm --cached
  } >/dev/null 2>&1
}

... или, полагаясь на оболочку, чтобы выполнить больше работы и не зависеть от xargs вообще:

# this is zsh-only code; 1-indexed arrays and `(@f)...` parameterization are zsh-isms
grmci() {
  {
    array_of_lines=("${(@f)$(git ls-files -i --exclude-from=.gitignore)}")
    { (( ${#array_of_lines[@]} )) && [[ ${array_of_lines[1]} != '' ]]; } || 
return 0
    git rm --cached -- "${array_of_lines[@]}"
  } >/dev/null 2>&1
}

Обратите внимание, что ни в одном из случаев мы не используем $(git ls-files ...) напрямую в качестве аргумента git rm --cached; Это ведет себя неправильно, когда файлы содержат пробелы, символы глобуса и т. д. c. в их именах. (Код, который мы имеем сейчас, не допускает имен файлов с буквенными символами новой строки, но не допускает и git).

0 голосов
/ 11 апреля 2020

BSD-совместимое решение с использованием информации, передаваемой @ CharlesDuffy.

Следующие функции проверяют, существует ли псевдоним, удаляя его, если так. Затем можно использовать функцию grmci для удаления игнорируемых файлов.

removeAlias () {
  CMDTYPE=$(type "$1") 
  case $CMDTYPE in
    *"alias"*)
      unalias $1 2> >(grep -Ev 'no such hash table element' >&2)
    ;;
    *"function"*)
      echo -e "\u001b[34mError: alias is a function\u001b[0m"
    ;;
    *"not found"*)
    ;;
    *)
      echo -e "Error: unknown command type for $1 return message is '$CMDTYPE'"
    ;;
  esac
}

# -- Git related----------------------------- 
removeAlias grmci
grmci () {
  git ls-files --others |
    xargs -n1 git --rm-cached
}

...