Запуск исполняемого файла CSH в bash вызывает синтаксические ошибки - PullRequest
0 голосов
/ 27 сентября 2018

Мне нужно запустить программу NACCESS на моем MacOS X High Sierra.

Наиболее заметная ошибка - if: Expression Syntax.

Эта ошибка, вероятно, связана с тем, что исполняемый файл NACCESS представляет собой скрипт CSH с #!/bin/csh в первой строке.

Я изменил первую строку на #!/bin/bash и начал получать ошибки, такие как ./naccess: line 14: syntax error near unexpected token `1' ./naccess: line 14: ` exit(1)'

Опять же, я думаю, что это происходит потому, что исполняемый файл должен выполняться в оболочке CSH, а неБаш.exit(1) отформатирован для оболочки CSH, тогда как bash захочет exit 1, в соответствии с этим ресурсом .

Я попытался набрать csh в Терминале, чтобы переключить оболочки, но команда echo $SHELL просто говорит мне, что я все еще в bash.

Я просмотрел свои варианты оболочки с помощью grep '^#!' /usr/bin/* и не могу найти никаких оболочек CSH.Я попытался загрузить tcsh, используя homebrew.Но я действительно понятия не имею, что я делаю в этот момент.

Я знаю, что оболочки CSH не поощряются, но как мне настроить и запустить оболочку CSH на моем Mac или как иначе запустить NACCESS?

[EDIT] Вот первые несколько строк кода NACCESS:

(Обратите внимание, что я запускаю его с аргументом файла .pdb, а также соответствующим образом установил path_to_naccess_repository. Я получаю usage naccess pdb_file [-p probe_size] [-r vdw_file] [-s stdfile] [-z zslice] -[hwyfaclqb] readout, если я запускаю только ./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

[EDIT] Я НЕ установил путь надлежащим образом>. <Так что этот вопрос в основном о том, как запустить csh-скрипт в bash.С этим скриптом csh проблем нет. </p>

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Если первая строка скрипта начинается с #!, называемого "shebang" , который указывает, как выполняется скрипт, если вы вызываете его как команду.Он дает полный путь к интерпретатору для вызова и, необязательно, аргумент для передачи интерпретатору вместе с именем скрипта.

Если у вас есть скрипт с именем foo, первая строка которого

#!/bin/csh

, затем введите ./foo эквивалентно /bin/csh foo.(Файл foo должен быть исполняемым; используйте chmod +x, если его еще нет.)

Это полностью не зависит от (а) вашей оболочки входа в систему, (б), оболочки, в которой вы находитесьв настоящее время работает, и (c) оболочка, указанная в переменной среды $SHELL.

Вы можете вызвать скрипт, явно введя имя оболочки, используемой для его запуска, ноВесь смысл #! в том, что вам не нужно этого делать.

Возможно, что /bin/csh не существует в вашей системе, или что это что-то отличное от C-shell.

tcsh - обновленная версия csh.Вы должны иметь возможность использовать его для выполнения любого сценария csh.

Узнайте, где в вашей системе установлен csh или tcsh, и обновите путь в строке #!, чтобы обратиться к нему.,Возможно, вам придется установить csh или tcsh самостоятельно - но вы сказали, что набрали csh, и это сработало, так что в этом нет необходимости.

Из оболочки bash введите команду type csh скажет вам, где установлен csh.

Кстати, строка #! для скрипта csh или tcsh должна включать параметр -f:

#!/bin/csh -f

Это говоритоболочка не для запуска сценария запуска пользователя ($HOME/.cshrc) при запуске сценария.Это экономит время и обеспечивает переносимость сценария, не зависящего от среды одного пользователя.(Это не применимо к скриптам sh или bash; sh и bash имеют опцию -f, но это имеет совершенно другое значение.)

Я попытался набрать csh в Терминал для переключения оболочек, но команда echo $SHELL просто говорит мне, что я все еще в bash.

Вызов оболочки не меняет значение вашей переменной среды $SHELL.Обычно это путь к вашей оболочке входа в систему по умолчанию (но его можно изменить).

Вы можете определить, используете ли вы tcsh, набрав echo $tcsh или echo $version.(у csh нет этих переменных).Вы можете узнать, если вы используете bash, набрав echo $BASH_VERSION.

0 голосов
/ 27 сентября 2018

Переменная SHELL просто перечисляет вашу первую оболочку входа в систему, она не изменится, если вы запустите другую оболочку.echo $0 покажет вам, что вы работаете csh.Вы можете либо остаться в bash и изменить шебанг на tcsh:

#!/usr/bin/tcsh -f

, либо полностью удалить шебанг и запустить

csh ./naccess

Если вы собираетесьПервый вариант, и не уверен, где находится csh, просто нажмите

which csh

, чтобы найти путь.Как добавляет @Chepner, поскольку файл имеет csh шебанг, не трогайте его и просто запустите, как указано выше.

...