Bash' source&#39 ;:意外令牌附近的语法错误`然后'

时间:2016-02-11 09:35:50

标签: bash

我有一个简单的bash脚本:

#!/bin/bash

if [ -n "abcd" ]; then
    echo "a non-empty string"
else
    echo "an empty string"
fi

脚本运行良好:

$ bash test.sh
non-empty string

但是当我尝试 source 时,会产生一条奇怪的错误消息:

$ source test.sh
bash: ./test.sh: line 3: syntax error near unexpected token `then'
bash: ./test.sh: line 3: `if [ -n "abcd" ]; then

欢迎任何建议。任何包含if命令的脚本都会出现此问题,包括Fedora的/etc/bashrc和我的其他脚本。

$ bash --version
GNU bash, version 4.3.42(1)-release (x86_64-redhat-linux-gnu)

1 个答案:

答案 0 :(得分:5)

如果命令包含then shell关键字而没有相应的if关键字,则会出现此类错误。

如果使用单词if来定义别名,则在Bash解析命令之前会扩展别名,从而导致出现这样的错误。可以通过运行type -a if来检查。如果它已被别名,您将看到类似于

的输出
if is aliased to <some command>
if is a shell keyword

然后可以通过运行unalias if来删除别名来解决问题。

运行bash test.sh时,新shell是非交互式的,默认情况下,Bash仅扩展交互式shell的别名。运行source test.sh表示文件中的命令在当前(交互式)shell中被解释,并且有问题的别名被扩展。

为了将来参考,如果交互式shell中存在问题,但非交互式shell中存在问题,则值得运行alias来检查已定义的别名。