运行 bash 中的 CSH 可执行文件抛出语法错误

Running CSH executable in bash throws syntax errors

我需要 运行 我的 MacOS X High Sierra 上的程序 NACCESS。

最突出的错误是if: Expression Syntax.

此错误可能是因为 NACCESS 可执行文件是第一行带有 #!/bin/csh 的 CSH 脚本。

我将第一行更改为 #!/bin/bash 并开始出现如下错误 ./naccess: line 14: syntax error near unexpected token `1' ./naccess: line 14: ` exit(1)'

同样,我认为这是因为可执行文件需要在 CSH shell 而不是 bash 中执行。根据 this resourceexit(1) 被格式化为 CSH shell,而 bash 需要 exit 1

我尝试在终端中输入 csh 来切换 shell,但是 echo $SHELL 命令只告诉我我仍在 bash。

我用 grep '^#!' /usr/bin/* 查看了我的 shell 选择,但找不到任何 CSH shell。我尝试使用自制软件下载 tcsh。但我真的不知道我现在在做什么。

我知道不鼓励使用 CSH shell,但是如何在我的 Mac 上安装 CSH shell 和 运行ning,或者如何否则我会得到 NACCESS 运行?

[编辑] 这是 NACCESS 代码的前几行:

(请注意,我 运行 使用 .pdb 文件参数对其进行设置,并且我已经适当地设置了 path_to_naccess_repository。如果我 运行 仅 ./naccess)

#!/bin/csh
set EXE_PATH = /path/to/repo
#naccess_start

set nargs = $#argv
if ( $nargs < 1 ) then
   echo "usage naccess pdb_file [-p probe_size] [-r vdw_file] [-s stdfile] [-z zslice] -[hwyfaclqb]"
   exit(1)
endif

set PDBFILE = 0
set VDWFILE = 0
set STDFILE = 0
set probe = 1.40
set zslice = 0.05
set hets = 0
set wats = 0
set hyds = 0
set full = 0
set asao = 0
set cont = 0
set oldr = 0
set nbac = 0

while ( $#argv )
  switch ($argv[1])
     case -[qQ]:
    echo "Naccess2.1 S.J.Hubbard June 1996"
    echo "Usage: naccess pdb_file [-p probe_size] [-r vdw_file] [-s stdfile] [-z zslice] -[hwyfaclq]"
    echo " "
    echo "Options:"
    echo " -p = probe size (next arg probe size)"
    echo " -z = accuracy (next arg is accuracy)"
    echo " -r = vdw radii file (next arg is filename)"
    echo " -s = standard accessibilities file (next arg is filename)"
    echo " -h = hetatoms ?"
    echo " -w = waters ?"
    echo " -y = hydrogens ?"
    echo " -f = full asa output format ?"
    echo " -a = produce asa file only, no rsa file ?"
    echo " -c = output atomic contact areas in asa file instead of accessible areas"
    echo " -l = old RSA output format (long)"
    echo " -b = consider alpha carbons as backbone not sidechain"
    echo " -q = print the usage line and options list"
    echo " "
        exit
        breaksw
     case -[pP]:
    shift
    set probe = $argv[1]
    breaksw
     case -[zZ]:
        shift
        set zslice = $argv[1]
    breaksw
     case -[hH]:
        set hets = 1
    breaksw
     case -[wW]:
        set wats = 1
        breaksw
     case -[yY]:
        set hyds = 1
        breaksw
     case -[rR]:
        shift
        set VDWFILE = $argv[1]
        breaksw
     case -[sS]:
        shift
        set STDFILE = $argv[1]
        breaksw
     case -[fF]:
        set full = 1
        breaksw
     case -[aA]:
        set asao = 1
        breaksw
     case -[cC]:
        set cont = 1
        breaksw
     case -[lL]:
        set oldr = 1
        breaksw
     case -[bB]:
        set nbac = 1
        breaksw
     default:
        if ( -e $argv[1] && $PDBFILE == 0 ) then
       set PDBFILE = $argv[1]
        endif
    breaksw
  endsw
  shift
end
#
if ( $PDBFILE == 0 ) then
  echo "usage: you must supply a pdb format file"
  exit(1)
endif

[编辑] 我没有正确设置路径 >.< 所以这个问题主要是关于如何在 bash 中获取 csh 脚本 运行ning。这个csh脚本没有问题。

SHELL 变量仅列出您的第一个登录 shell,如果您 运行 另一个 shell,它不会改变。 echo [=14=] 会告诉你你是 运行宁 csh。您的选择是留在 bash 并将 shebang 更改为 tcsh:

#!/usr/bin/tcsh -f

或完全删除 shebang 运行

csh ./naccess

如果您选择第一个选项,但不确定 csh 在哪里,只需点击

which csh

寻找路径。正如@Chepner 所补充的那样,由于该文件带有一个 csh shebang,所以不要触摸它,就像上面那样 运行 它。

如果脚本的第一行以 #! 开头,称为 "shebang",它指定了当您将脚本作为命令调用时如何执行该脚本。它给出了要调用的解释器的完整路径,以及可选的传递给解释器的参数以及脚本名称。

如果您有一个名为 foo 的脚本,其第一行是

#!/bin/csh

然后键入 ./foo 等同于 /bin/csh foo。 (文件 foo 必须是可执行文件;如果还没有,请使用 chmod +x。)

这完全独立于 (a) 您的登录 shell,(b),您当前 运行 的 shell,以及 (c) shell 由 $SHELL 环境变量指定。

可以 通过显式键入用于 运行 它的 shell 的名称来调用脚本,但是 #! 是你不必那样做。

可能 /bin/csh 在您的系统上不存在,或者它不是 C-shell.

tcshcsh 的更新版本。您应该能够使用它来执行任何 csh 脚本。

找出 cshtcsh 在系统上的安装位置,并更新 #! 行中的路径以引用它。您可能需要自己安装 cshtcsh - 但您说您输入了 csh 并且它起作用了,所以这不是必需的。

来自 bash shell,命令 type csh 将告诉您 csh 的安装位置。

顺便说一下,csh 或 tcsh 脚本的 #! 行应该包含一个 -f 选项:

#!/bin/csh -f

这告诉 shell 在 运行 启动脚本时不要获取用户的启动脚本 ($HOME/.cshrc)。它可以节省时间并确保脚本是可移植的,不依赖于一个用户的环境。 (这 不适用于 sh 或 bash 脚本;sh 和 bash 有一个 -f 选项,但它具有完全不同的含义。)

I tried typing csh into Terminal to switch shells, but an echo $SHELL command just tells me I'm still in bash.

调用 shell 不会更改 $SHELL 环境变量的值。它通常设置为默认登录路径 shell(但可以更改)。

您可以通过输入 echo $tcshecho $version 来判断您是否 运行 宁 tcsh。 (csh 没有这些变量)。你可以通过输入 echo $BASH_VERSION.

来判断你是否 运行ning bash