Вы можете направить stderr вашей программы в grep и использовать(bash -специфическую переменную )PIPESTATUS
, чтобы различать 4 комбинации успешного/неудачного выполнения команды и команды, напечатанной/не напечатанной, это сообщение об ошибке:
{ your_command 2>&1 >&3 | grep your_error_message >/dev/null; } 3>&1
case ${PIPESTATUS[*]} in
0*) ;; # the command succeeded
*0) ;; # the command failed but printed the error message
esac
Пример:
# usage wrapper pattern cmd args...
wrapper(){
msg=$1; shift
{ "$@" 2>&1 >&3 | grep "$msg" >/dev/null; } 3>&1
case ${PIPESTATUS[*]} in
0*|*0) return 0;;
*) return "${PIPESTATUS[0]}";;
esac
}
# usage test_cmd status error_message
test_cmd(){ status=$1; shift; echo >&2 "$@"; return "$status"; }
$ wrapper foo test_cmd 13 foo; echo $?
0
$ wrapper foo test_cmd 13 bar; echo $?
13
Примечания:
Не заменяйте grep >/dev/null
на grep -q
; это приведет к выходу grep при первом совпадении и вызовет SIGPIPE для вашей команды.
Однако вы можете поставить ... | tee /dev/stderr |...
между вашей командой и grep; это приведет к тому, что сообщения об ошибках будут переданы в grep и напечатаны в stderr.
Многие некачественные программы (, особенно сценарии Python ), выводят сообщения об ошибках в стандартный вывод вместо стандартного stderr; если это так, вы можете просто использовать
your_command 2>&1 |...
вместо всего этого { 2>&1 >&3 |... } >&3
fd жонглирования.
Мне удалось заставить установщик Debian -распознать набор микросхем Realtek 8852AE и загрузить прошивку и модули ядра, так что я думаю, что это ответ на мой собственный вопрос:
### Make the Realtek 8852AE firmware available during installation
d-i preseed/early_command string \
/bin/cp /cdrom/realtek8852/rtw8852a_fw.bin /lib/firmware/rtw8852a_fw.bin
### Make the Realtek 8852AE network driver available during installation
d-i preseed/early_command string \
/bin/cp /cdrom/realtek8852/rtw89core.ko /lib/modules/5.10.0-8-amd64/rtw89core.ko; \
/bin/cp /cdrom/realtek8852/rtw89pci.ko /lib/modules/5.10.0-8-amd64/rtw89pci.ko
Моя первоначальная попытка не удалась, потому что на этапе "preseed/early _command" не были загружены никакие другие модули, и в результате команда modprobe этого модуля завершилась неудачно из-за неудовлетворенных зависимостей.
Мысленное примечание :ранняя _и поздняя _команды принимают несколько команд, связанных одна с другой двоеточием (; ), но убедитесь, что за последней командой не следует такое двоеточие...
Следующий вызов :Фактическое подключение к сети во время установки :/.