首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打开终端时来自/usr/share/bash-完成/bash-完成的源命令错误

打开终端时来自/usr/share/bash-完成/bash-完成的源命令错误
EN

Ask Ubuntu用户
提问于 2018-06-15 17:02:53
回答 2查看 7K关注 0票数 6

当我打开终端时,会发现以下错误:

代码语言:javascript
复制
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文件的这个区域:

代码语言:javascript
复制
_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
}

为什么我在那部分出了个错误?

EN

回答 2

Ask Ubuntu用户

回答已采纳

发布于 2018-06-16 16:58:53

我认为这可能是与这个U&L职位相同的问题:您有fi的别名。脚本在大多数情况下都很好,但是混叠shell关键字可能会导致意想不到的问题:

代码语言:javascript
复制
$ 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的第一个位置。这可能是在设置别名之后第一次使用fi,具体取决于您放置别名的位置,以及bash提供的bash完成脚本的具体位置。

票数 3
EN

Ask Ubuntu用户

发布于 2018-06-17 19:32:44

要查看您的别名是否与bash内置或系统命令冲突,请使用以下脚本:

代码语言:javascript
复制
#!/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并插入以下“坏”别名:

代码语言:javascript
复制
alias fi=find
alias test='ls test'

现在运行脚本alias-check

代码语言:javascript
复制
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是shell关键字
  • 测试是shell内置的

在别名中查找这些类型的错误。

测试后,不要忘记删除别名fitest,并再次保存~/.bashrc

您不能简单地在命令行中发出别名来运行测试,因为脚本#!/bin/bash -i的第一行使用~/.bashrc加载了一个新的shell。

票数 4
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1046930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档