Игнорировать ошибку в команде setenv и продолжить дальнейшее выполнение скрипта csh

У меня есть файл, содержащий набор команд setenv (созданный из другого скрипта).

a.csh

setenv XYZ "${ABC} ab"
setenv PQR "test"

Затем я запускаю source a.csh в терминале Linux.

Но если переменная $ABC не установлена, источник выдает ошибку с неопределенной переменной ABC и завершает работу, не выполняя следующий набор команд в a.csh (например, setenv PQR "test").

Я хочу продолжить выполнение этого набора команд после setenv XYZ "${ABC} ab".

Я попытался добавить перенаправление ошибок для команды setenv, но это не сработало.

setenv XYZ "${ABC} ab" 2 > /dev/null

Я обнаружил, что ошибку исходной команды можно поймать с помощью

source a.csh & echo $?

Но это будет игнорировать команды в файле, которые следуют за командой с ошибкой, поскольку она завершает команду при обнаружении ошибки.

Это небольшой пример того, как выглядит мой файл csh. Но он может содержать длинный список setenvs.

Проверить, существует ли $ABC, а затем запустить setenv невозможно.


person Venkata Krishna    schedule 22.01.2020    source источник


Ответы (1)


Ближайший обходной путь, который я нашел для этого, заключался в создании setenvs, как показано ниже, если значение setenv содержит переменную.

[ "$?ABC" == "0" ] && echo 'Undefined $ABC' || setenv XYZ "$ABC aa"

Не удалось избежать проверки существования переменной.
Но не требует блоков if else и делает его однострочным.

Объяснение.
$?ABC возвращает 0, если переменная $ABC не определена.

Если переменная определена, [ "$?ABC" == "0" ] имеет значение false, вызывающее выполнение || условие.
В таком условии, как A && B, B выполняется только в том случае, если A истинно (базовое поведение &&).

Если переменная ABC не определена, [ "$?ABC" == "0" ] имеет значение true и код, следующий за &&, выполняется echo 'Undefined $ABC'.

person Venkata Krishna    schedule 28.01.2020