运行 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 resource,exit(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.
tcsh
是 csh
的更新版本。您应该能够使用它来执行任何 csh
脚本。
找出 csh
或 tcsh
在系统上的安装位置,并更新 #!
行中的路径以引用它。您可能需要自己安装 csh
或 tcsh
- 但您说您输入了 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 $tcsh
或 echo $version
来判断您是否 运行 宁 tcsh
。 (csh 没有这些变量)。你可以通过输入 echo $BASH_VERSION
.
来判断你是否 运行ning bash
我需要 运行 我的 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 resource,exit(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.
tcsh
是 csh
的更新版本。您应该能够使用它来执行任何 csh
脚本。
找出 csh
或 tcsh
在系统上的安装位置,并更新 #!
行中的路径以引用它。您可能需要自己安装 csh
或 tcsh
- 但您说您输入了 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 anecho $SHELL
command just tells me I'm still in bash.
调用 shell 不会更改 $SHELL
环境变量的值。它通常设置为默认登录路径 shell(但可以更改)。
您可以通过输入 echo $tcsh
或 echo $version
来判断您是否 运行 宁 tcsh
。 (csh 没有这些变量)。你可以通过输入 echo $BASH_VERSION
.
bash