Из сценария оболочки выполните другой с аргументами и получите код возврата

На i686 / 32-битном двоичном процессоре со свежей установкой Debian Stretch я установил Octave 4.2.1 и запустил ./mytest после предоставления ему прав выполнения:

 #!/bin/bash ./mytest.m 

где test.m читает

 #!/usr/bin/octave exit(0) 

Учитывая два сценария, хранящихся в ~/tmp , mytest

 #!/bin/bash if $1/mytest.m "$2"; then echo "good" else echo "bad" fi 

и mytest.m

 #!/usr/bin/octave param = argv(){1}; if strcmp(param, "happyend") exit(0) else exit(1) end 

Запуск tmp/mytest tmp happyend будет проходить, happyend правило, до mytest а затем до mytest.m , который передаст сигнал 0 обратно в mytest , который будет печатать «хорошо». Теперь, как получить код возврата (выхода) из mytest.m в переменной? (0 в приведенном выше примере).

Интуитивный вариант

 #!/bin/bash result=$("$1"/mytest.m "$2") if [ $result = 0 ]; then echo "good" else echo "bad" fi 

не будет работать.

Чтобы получить код возврата (выхода) из команды, вам нужно сохранить $? значение, возможно, в переменную, называемую result :

 "$1/mytest.m" "$2" result=$? if [ "$result" -eq 0 ]; then echo "good" else echo "bad" fi 

Если вы хотите сохранить результат достаточно долго, чтобы проверить его, пропустите переменную result с помощью:

 "$1/mytest.m" "$2" if [ $? -eq 0 ]; then echo "good" else echo "bad" fi 

но будьте осторожны, чтобы сразу проверить $? после запуска mytest.m, так как любые последующие команды вернут код возврата в $? ,

Если вы хотите только проверить, равен ли результат нулю, вам не нужно рассматривать его как целое. Просто рассматривайте команду как условное.

 if "$1/mytest.m" "$2"; then echo "good" else echo "bad" fi