исходная ошибка команды от/usr/share/bash-completion/bash-completion, когда я открываю терминал

Когда я открываю терминал, я получаю эти ошибки:

bash: /usr/share/bash-completion/bash_completion: line 171: syntax error near unexpected token `}'
bash: /usr/share/bash-completion/bash_completion: line 171: `}'

И это из-за этой области bash-completion файл:

_upvar()
{
    if unset -v "$1"; then           # Unset & validate varname
        if (( $# == 2 )); then
            eval $1=\"\$2\"          # Return single value
        else
            eval $1=\(\"\${@:2}\"\)  # Return array
        fi
    fi
}

Почему я получаю ошибку в той части?

6
задан 17 June 2018 в 08:25

2 ответа

Я думаю, что это может быть той же проблемой, что и в этой публикации U & amp; L : у вас есть псевдоним для fi. Сценарий хорош в большинстве случаев, но наложение ключевых слов в оболочке может вызвать неожиданные проблемы:

$ alias fi=find
$ . /usr/share/bash-completion/bash_completion
bash: /usr/share/bash-completion/bash_completion: line 171: syntax error near unexpected token `}'
bash: /usr/share/bash-completion/bash_completion: line 171: `}'

Эта функция, несмотря на то, что находится в строке 170, занимает первое место в этом файле, в котором используется fi. В зависимости от того, где именно вы поместили это определение псевдонима, и где именно bash получаются сценарии завершения bash, это может быть первый раз после того, как этот псевдоним установлен, когда используется fi.

3
ответ дан 23 November 2019 в 07:42

Чтобы увидеть, не конфликтует ли какой-либо из ваших псевдонимов со встроенной bash или системной командой, используйте этот скрипт:

#!/bin/bash -i

# NAME: alias-check
# PATH: /mnt/e/bin
# DESC: Verify alias doesn't conflict with bash built-in
# DATE: June 17, 2018.

# Get aliases
alias > /tmp/alias.lst
sed -i 's/=.*//; s/alias //g' /tmp/alias.lst
#cat /tmp/alias.lst
while read -r line 
do 
   command type -a ${line}
done< /tmp/alias.lst

Тестирование плохих псевдонимов

Редактируйте ~/.bashrc и вставьте эти «плохие» псевдонимы:

alias fi=find
alias test='ls test'

Теперь запустите скрипт alias-check:

bash: /home/rick/.bashrc: line 171: syntax error: unexpected end of file
alert is aliased to `notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e 's/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//')"'
cdd is aliased to `cd /home/rick/SERVER/#/Dump'
cdh is aliased to `cd /home/rick'
cdm is aliased to `cd /media/rick/ST9_Win7/Users/Person/Music/iTunes/iTunes Media/Music'
egrep is aliased to `egrep --color=auto'
egrep is /bin/egrep
fgrep is aliased to `fgrep --color=auto'
fgrep is /bin/fgrep
fi is aliased to `find'
fi is a shell keyword
grep is aliased to `grep --color=auto'
grep is /bin/grep
l is aliased to `ls -CF'
la is aliased to `ls -A'
ll is aliased to `ls -alF'
ls is aliased to `ls --color=auto'
ls is /bin/ls
lsdrv is aliased to `lsblk -o NAME,FSTYPE,LABEL,MOUNTPOINT,SIZE,MODEL'
redalert is aliased to `notify-send --urgency=critical -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e 's/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//')"'
sudo is aliased to `sudo '
sudo is /usr/bin/sudo
test is aliased to `ls test'
test is a shell builtin
test is /usr/bin/test
zenity is aliased to `zenity 2>/dev/null'
zenity is /mnt/e/usr/local/bin/zenity
zenity is /usr/local/bin/zenity
zenity is /usr/bin/zenity

Обратите внимание на строки:

  • fi is ] shell ключевое слово
  • test - это встроенная оболочка

Ищите эти типы ошибок в своих псевдонимах.

После тестирования не забудьте удалить псевдонимы fi и test и снова сохранить ~/.bashrc.

Вы не можете запустить тест, просто введя псевдоним в командной строке, потому что первая строка скрипта #!/bin/bash -i загружает новую оболочку, используя ~/.bashrc.

4
ответ дан 23 November 2019 в 07:42

Другие вопросы по тегам:

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