Как вернуть код выхода? Ошибка: return: Чтение: требуется числовой аргумент

Вот упрощенная версия моего скрипта. Мой вопрос: как мне вернуть код выхода из apt-get в этом случае?

 #!/bin/bash install_auto() { apt-get -h > /dev/null 2>&1 if [ $? -eq 0 ] ; then return $(sudo apt-get install --assume-yes $@) fi return 1 } echo "installing $@" install_auto "$@" echo $? echo "finished" exit 0 

Выход:

 ./install_test.sh: line 5: return: Reading: numeric argument required 

Обновление: я придумал что-то, что работает:

 return $(sudo apt-get install --assume-yes "$@" >/dev/null 2>&1; echo $?) 

Это хороший подход?

2 Solutions collect form web for “Как вернуть код выхода? Ошибка: return: Чтение: требуется числовой аргумент”

return() Bash return() может возвращать только числовые аргументы. В любом случае, по умолчанию, он вернет статус завершения последнего запуска команды. Итак, все, что вам действительно нужно, это:

 #!/usr/bin/env bash install_auto() { apt-get -h > /dev/null 2>&1 if [ $? -eq 0 ] ; then sudo apt-get install --assume-yes $@ fi } 

Вам не нужно явно указывать возвращаемое значение, поскольку по умолчанию функция возвращает $? , Однако это не сработает, если первая команда apt не удалась, и вы не вошли в цикл if . Чтобы сделать его более надежным, используйте это:

 #!/usr/bin/env bash install_auto() { apt-get -h > /dev/null 2>&1 ret=$? if [ $ret -eq 0 ] ; then ## If this is executed, the else is ignored and $? will be ## returned. Here, $?will be the exit status of this command sudo apt-get install --assume-yes $@ else ## Else, return the exit value of the first apt-get return $ret fi } 

Общее правило состоит в том, что для того, чтобы функция возвращала статус выхода определенного задания, а не обязательно последнюю, которую она выполняла, вам нужно сохранить статус выхода в переменной и вернуть переменную:

 function foo() { run_a_command arg1 arg2 argN ## Save the command's exit status into a variable return_value= $? [the rest of the function goes here] ## return the variable return $return_value } 

EDIT: На самом деле, как отметил @gniourf_gniourf в комментариях, вы могли бы значительно упростить все это, используя && :

 install_auto() { apt-get -h > /dev/null 2>&1 && sudo apt-get install --assume-yes $@ } 

Возвращаемое значение этой функции будет одним из следующих:

  1. Если apt-get -h не удалось, он вернет код выхода
  2. Если apt-get -h преуспел, он вернет код выхода sudo apt-get install .

Для полноты, вот моя фактическая функция с некоторыми изменениями, предложенными @terdon и @gniourf_gniourf:

 install_auto() { if [ ! $# -gt 0 ] ; then echo "usage: $0 package_name [package_name ...]" fi apt-get -h > /dev/null 2>&1 if [ $? -eq 0 ] ; then if [ -f "$@" ] || [[ "$@" =~ '/' ]] ; then sudo gdebi -n "$@" return $? else sudo apt-get install --assume-yes "$@" return $? fi fi zypper help > /dev/null 2>&1 if [ $? -eq 0 ] ; then sudo zypper --non-interactive --no-gpg-checks --quiet install --auto-agree-with-licenses "$@" return $? fi #may check other package managers in the future echo "ERROR: package manager not found" return 255 } 

Я ценю любые дальнейшие предложения.

  • Потрясающее поведение округления с печатью
  • Неверный код выхода awk
  • Почему это «while kill -0 $ PID», а не «до kill -0 $ PID»?
  • Как создать новый пустой файл в сценарии bash?
  • Отправьте EOF на именованный канал - очистка / высыхание fifo
  • Как удалить все комментарии из файла?
  • Исходное перенаправление bash - в чем разница между >> и> &, перенаправлением и дублированием?
  • Получение идентификатора родительского / дочернего процесса из определенного идентификатора процесса
  • Удалить символы строки строки из stdout? Несколько строк в одну строку
  • Почему этот скрипт зацикливается на первой строке файла txt?
  • Создание функции, отображающей имя переменной и ее значение
  • Interesting Posts

    Устройство USB 2.0 не работает в портах USB 3.0

    Преобразование всех первых символов в идентификатор электронной почты в верхний регистр в BASH

    Как отлаживать NT_STATUS_INVALID_PARAMETER при совместном использовании cifs?

    Как использовать grep для исходного кода без комментариев

    Использование нескольких независимых экземпляров Thunderbird

    Прочитайте файл с двумя столбцами, rsync каждую строку от столбца 1 до столбца 2

    Не удается выполнить файлы на другом разделе

    Как переопределить параметры порта при подключении к общедоступному Wi-Fi?

    Как правильно создать изображение докеры cron?

    Хостинг на FreeBSD

    Проблема с установкой Clang: undefined symbol: LLVMInitializeMipsAsmParser

    Как извлечь строку между двумя \ n в файле

    Не удается подключиться к Интернету с помощью карты Realtek Lan RTL8105TA

    Как бороться с PATH в скрипте установки для моих приложений?

    Как восстановить случайно удаленные kdesu

    Linux и Unix - лучшая ОС в мире.