Rose debug info
---------------

local в bash подавляет ошибки

Писать скрипты на баше — это весёлое занятие. Никогда не знаешь, когда выползет рояль в кустах.

Сейчас, например, наткнулся на рояль, о котором, слава богу, был заранее предупреждён в «Bite Size Bash»

Давайте возьмём такую тестовую функцию, которая задаёт недопустимый режим вращения кулеров на платформе Supermicro. Режима 0x05 нет, поэтому ждём ошибку.

test_fan() {
    local _result
    if _result=$(ipmitool raw 0x30 0x45 0x01 0x05)
    then
        return 1
    fi
    echo "YES"
}

A=$(test_fan)
echo $?
echo "$A"

Как вы думаете, что произойдёт в результате выполнения этого скрипта?

Здравый смысл подсказывает, что:

  • ipmitool свалится с ошибкой, плюнет ее в STDERR, и поднимет ненулевое значение в $?
  • дальше мы провалимся внутрь условия и вывалимся из функции с ошибкой
  • после вызова функции в $? мы поймаем 1, а значение $A вовсе будет пусто.

Как бы не так:

# ./test_fan_control
Unable to send RAW command (channel=0x0 netfn=0x30 lun=0x0 cmd=0x45 rsp=0xcc): Invalid data field in request
0
YES

А всё потому что в баше почему-то local подавляет все ошибки.

Уберём его и получим ожидаемое поведение:

# ./test_fan_control
Unable to send RAW command (channel=0x0 netfn=0x30 lun=0x0 cmd=0x45 rsp=0xcc): Invalid data field in request
1
Поделиться
Отправить
 12   1 мес   bash   неочевидно   перезалив