Выйти из скрипта tcsh, если ошибка

Я пытаюсь написать сценарий tcsh. Мне нужен выход сценария, если какая-либо из его команд не работает.

В оболочке я использую set -e, но я не знаю его эквивалента в tcsh

#!/usr/bin/env tcsh

set NAME=aaaa
set VERSION=6.1

#set -e equivalent
#do somthing

Спасибо


person ARM    schedule 18.08.2015    source источник
comment
Вы пробовали? Еще вы проверили man tcsh? Удачи.   -  person shellter    schedule 18.08.2015
comment
Когда я использую set -e как в оболочке, я получаю эту ошибку: set: имя переменной должно начинаться с буквы.   -  person ARM    schedule 18.08.2015
comment
Глядя на справочную страницу, я думаю, что вы должны использовать ее как #!/bin/tcsh -e ... (конечно, вверху файла). Удачи.   -  person shellter    schedule 18.08.2015
comment
Когда я ставлю #!/bin/tcsh -e вместо #!/usr/bin/env tcsh, скрипт ничего не делает. команды tcsh не выполняются   -  person ARM    schedule 18.08.2015
comment
ладно, видимо я не угадал правильный путь, где живет tcsh. Если #!/usr/bin/env tcsh -e не работает, то найдите правильный путь к tcsh и отредактируйте бабку как надо. Удачи.   -  person shellter    schedule 18.08.2015


Ответы (1)


В (t)csh set используется для определения переменной; set foo = bar присвоит значение bar переменной foo (как foo=bar в сценариях оболочки Bourne).

В любом случае от tcsh(1):

Argument list processing
   If the first argument (argument 0) to the shell is `-'  then  it  is  a
   login shell.  A login shell can be also specified by invoking the shell
   with the -l flag as the only argument.

   The rest of the flag arguments are interpreted as follows:

[...]

   -e  The  shell  exits  if  any invoked command terminates abnormally or
       yields a non-zero exit status.

Поэтому вам нужно вызвать tcsh с флагом -e. Давайте проверим это:

% cat test.csh
true
false

echo ":-)"

% tcsh test.csh
:-)

% tcsh -e test.csh
Exit 1

Невозможно установить это во время выполнения, как с set -e sh, но вы можете добавить его в hashbang:

#!/bin/tcsh -fe
false

поэтому он добавляется автоматически, когда вы запускаете ./test.csh, но это не добавляет его при вводе csh test.csh, поэтому я рекомендую использовать что-то вроде start.sh, которое вызовет скрипт csh:

#!/bin/sh
tcsh -ef realscript.csh
person Martin Tournoij    schedule 18.08.2015
comment
Вы также установили здесь флаг -f — что делает этот флаг? - person qff; 02.01.2019
comment
Из справочной страницы tcsh ... -f Оболочка не загружает никаких ресурсов или файлов запуска, не выполняет никакого хэширования команд и, таким образом, запускается быстрее. - person Krishna; 17.07.2019