Заменить код выхода на основе stdout? - PullRequest
0 голосов
/ 17 марта 2020

У меня есть команда, для которой я хочу написать несколько сценариев, но она возвращает ненулевой код завершения для сценария, который меня не волнует. Этот сценарий обнаруживается на основе ответа stdout, поэтому я хочу «исправить» код состояния, чтобы можно было выполнить некоторые сценарии вокруг него.

например,

$ hg evolve
nothing to evolve on current working copy parent
(6 other orphan in the repository, do you want --any or --rev)
$ echo $?
2

Есть ли какой-нибудь удобный способ Я могу обернуть это чистым bash, чтобы изменить код состояния, если стандартный вывод IFF совпадает с некоторым регулярным выражением?

например,

fixstatus '^nothing to evolve\b' -- hg evolve # would return 0 if stdout from hg evolve matches that regex, otherwise returns whatever it would have normally returned

Что-то в этом роде. Я не думаю, что смогу решить это с помощью конвейера, потому что тогда код завершения будет соответствовать этой последней команде.

Ответы [ 3 ]

2 голосов
/ 17 марта 2020

Вы можете сделать что-то вроде:

output=$( hg evolve )
status=$?
if echo "$output" | grep -q '^nothing to evolve\b'; then
    status=0
fi
sh -c "exit $status"  # Set $?

Итак, в функции это может выглядеть следующим образом:

fixstatus() {
    local output status regex
    regex="$1"
    shift
    output=$( "$@" )
    status=$?
    if echo "$output" | grep -q -- "$regex"; then
        status=0
    fi
    printf "%s\n" "$output"
    return $status
}

И вызывать его следующим образом: fixstatus '^nothing to evolve\b' hg evolve

Поскольку вы используете bash, вы также можете использовать [[ ... =~ ... ]] вместо grep.

1 голос
/ 18 марта 2020

В самом интерпретаторе как можно больше:

output="$( hg evolve )"
status=$?
case "$output" in
"nothing to evolve"*) status=0;;
esac
exit $status

Технически это не точно соответствует регулярному выражению, которое вы использовали, поэтому вот альтернатива:

output="$( hg evolve )"
status=$?
pat='^nothing to evolve\b'
if [[ "$output" =~ $pat ]] # $pat not quoted
then status=0
fi
exit $status
0 голосов
/ 18 марта 2020

Оказывается, hg писал в stderr. Подправил ответ Уильяма немного, теперь, похоже, он работает для моего варианта использования:

#!/bin/bash

regex="$1"
shift
{ output=$("$@" 2>&1 >&3 3>&-); } 3>&1
status=$?
if \grep -q --perl-regexp -- "$regex" <<<"$output"; then
    exit 0
fi
exit $status

Я поместил это в ~/bin/errstatus0, чтобы другие сценарии могли его запускать (псевдоним не работы), и создал псевдоним в ~/.hgrc:

_evolve = !errstatus0 '^nothing to evolve\b' hg evolve --all --no-update

Теперь hg _evolve возвращает желаемый статус, и я могу связать его с помощью &&.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...