Как проверить код выхода команды внутри, если утверждение

Насколько я понимаю, есть проблема с fdupes команда, которая выводит пустую строку в конце:

[PRD][]localhost:~ 12:17:09     
$ fdupes -r work/
work/sockperf-sockperf_v2/news          
work/sockperf-sockperf_v2/src/.dirstamp
work/sockperf-sockperf_v2/src/.deps/.dirstamp

[PRD][]localhost:~ 12:17:19

Затем при обработке в цикле последний элемент остается пустым, что вызывает ошибку в md5sum , как когда файл не существует:

$ md5sum ' ' 
md5sum: : no such file of directory 

И затем сценарий пытается переместить этот пустой файл имен, что также приводит к ошибке mv .

0
09.03.2019, 17:15
2 ответа

Ваш скрипт не делает то, что вы хотите, потому чтокогда timeout -t 10 commandимеет статус выхода 0 --, который является статусом выхода, который считается истинным в сценариях оболочки --, команда timeout -t 10 command || [ $? = 143 ]просто завершается со статусом выхода 0 и не вызывает право -сторона ||для запуска. Точно так же, если вы замените ||на &&, то любой ненулевой статус выхода из левой -стороны будет статусом выхода всей команды, а правая -сторона будет не быть запущенным.

Вы должны просто запустить их как две отдельные команды , разделив их ;или новой строкой. При необходимости вы все равно можете использовать их оба в качестве условия if, когда делаете это (, см. ниже ).

Я предполагаю, что вам нужен статус выхода timeout -t 10 command, а не command(, если он отличается от ). Иначе мне непонятно, чего вы хотите; , как и ilkkachu , я не знаком с командой timeout, которая принимает параметр -t. Обычно я бы предложил вам сделать это таким образом, за исключением того, что это звучит так, как будто ваше «внешнее ограничение» может запретить это, поскольку оно вообще не использует if:

timeout -t 10 command
test "$?" -eq 143
exit

Команда test/ [возвращает код выхода 0, чтобы указать true, и 1, чтобы указать false, поэтому вам не нужно писать отдельные ветки с exit 0и exit 1. Встроенная команда exitпри запуске без аргументов заставляет оболочку возвращать статус выхода последней выполненной команды.

Если вы уже находитесь в конце скрипта, то вы можете опустить exit, потому что когда управление перетекает из конца скрипта, это имеет тот же эффект, что иexit:

timeout -t 10 command
test "$?" -eq 143

(В любом случае вы можете написать [ "$?" -eq 143 ]вместо test "$?" -eq 143, если хотите. Подробнее об использовании [/ testсм. ниже.)

Хотя ваше описание звучит так, будто вы не можете использовать этот код в точности, вы, тем не менее, должны быть в состоянии изменить его, чтобы он принял требуемую форму.Вы сказали, что должны не только выполнить проверку , но также запустить команду в предложении if. Это, по-видимому, запрещает удобочитаемый и идиоматический подход, предложенный Хауке Лагингом запуска команды перед if.

Так что, если вы не можете этого сделать, вы можете включить команду в условие if, как вы это делали, но отделить ее от вашей команды test/ [с помощью ;, а не||:

if timeout -t 10 command; [ "$?" -eq 143 ]; then
    exit 0
else
    exit 1
fi

(Вы можете обойтись без""вокруг $?. Вы также можете написать =вместо 143, хотя это сбивает с толку, потому что =означает текстовое, а не числовое сравнение. Вы можете написать test "$?" -eq 143вместо [ "$?" -eq 143 ], если хотите.)

Причина, по которой это работает, заключается в том, что вам разрешено писать ifусловие, состоящее из нескольких команд, разделенных точкой с запятой или даже новой строкой. Вот почему грамматика оболочки требует, чтобы вы писали then, чтобы указать конец условия if. Поэтому вам не нужно пытаться обходным путем использовать оператор &&или ||, когда ваша цель состоит в том, чтобы запустить две команды в качестве условия if, заставляя ifсамостоятельно проверять только вторую.

Обратите внимание, что я предлагаю это только потому, что вы сказали, что все должно быть в состоянии if. Я не рекомендую писать такие сценарии, когда в этом нет необходимости.

4
28.01.2020, 02:16
timeout -t 10 command
if [ $? -eq 143 ]; then
    exit 0
else
    exit 1
fi
2
28.01.2020, 02:16

Теги

Похожие вопросы