我们有两台服务器:装有 Oracle Linux 7.6 的测试箱和装有 Oracle Linux 7.7 的生产箱。
运行 exec /bin/tcsh 命令会产生两个不同的结果。
在测试服务器上:
# exec /bin/tcsh
#
没有错误;但是,在生产服务器上:
# exec /bin/tcsh
if: Expression Syntax.
#
我们认为生产包装盒上的 tcsh 软件包存在问题,并卸载/重新安装了它,但这样做并没有解决问题。关于我们还可以尝试解决此问题的任何想法/建议?
其中一条评论建议将 -V 添加到命令中。以下是输出的最后几行:
if ( $?QT_PLUGIN_PATH ) then
if ( "${QT_PLUGIN_PATH}" !~ *${libdir}/kde4/plugins* ) then
else
end
if [ ! -d ${HOME}/.local/share -a -w ${HOME} ] then
if: Expression Syntax.
有一个测试服务器,其中 exec 命令不会异常终止。这是上面同一行的 -V 输出:
if ( ! -d ${HOME}/.local/share ) then
唯一不同的是-a -w ${HOME}
.
答案1
此类错误消息可能是由 shell 执行的登录脚本中的语法错误引起的tcsh
:
- 全系统
/etc/csh.cshrc
- 全系统
/etc/csh.login
- 特定于用户的
~/.cshrc
- 特定于用户的
~/.login
在 Bourne/POSIX 风格的 shell 中,if
语句通常是if [ condition ]; then ... else ... fi
, butcsh
并将tcsh
其表示为if (condition) then ... else ... endif
。如果您习惯于 Bourne/POSIX 风格的脚本编写,那么fi
在endif
为tcsh
.
答案2
答案是kde-settings包中有一个bug。 kde.csh 中有 bourne-shell 代码。
我们决定执行解决方法并按以下方式编辑 /etc/profile.d/kde.csh 文件:
原行: if [ ! -d ${HOME}/.local/share -a -w ${HOME} ]
编辑行: if ( ! -d ${HOME}/.local/share && -w ${HOME} )
版本-所选组件的发布号(如果适用):kde-settings-19-23.9.el7.noarch
这是服务器上安装的版本。有一个可用更新,但未安装,kde-settings-19-23.10。这是 bugzilla 的链接: https://bugzilla.redhat.com/show_bug.cgi?id=1738491。