Функции оболочки Unix, подстановка команд и выход - PullRequest
0 голосов
/ 04 октября 2011

Пожалуйста, объясните мне, как правильно использовать функцию оболочки Unix.

Например, у нас есть следующие функции f и g:

f()
{
   #do something
   return $code
}

g()
{
   print $something
}

Мы можем использовать функцию f следующим образом:

f
if [[ $? -eq 0 ]]; then
   #do 1
else
   #do 2
fi

Эта функция выполняет некоторую работу ивыходы с некоторым статусом выхода.
И мы можем проанализировать этот статус выхода.

Мы можем использовать функцию g следующим образом:

g

или

result=$(g)
if [[ $result = "something" ]]; then
   #do something
fi

В первом случае мы только что вызвали функцию.
Во втором случаемы использовали подстановку команд, чтобы назначить весь текст, который печатает функция, на стандартный вывод переменной result.

Но что, если есть следующая функция:

z()
{
   user=$1
   type=$2
   if [[ $type = "customer" ]]; then
      result=$(/somedir/someapp -u $user)
      if [[ $result = "" ]]; then
         #something goes wrong
         #I do not want to continue
         #I want to stop whole script
         exit 1
      else
         print $result
      fi
   else
      print "worker"
   fi
}

Я могу использовать функцию z следующим образом:

z

Если что-то пойдет не так, тогда весь скрипт будетбыть остановленным.
Но что, если кто-то использует эту функцию в подстановке команд:

result=$(z)

В этом случае, если someapp вернет пустую строку, скрипт не будет остановлен.
Это неправильный подход к использованиювыход в функции?

1 Ответ

1 голос
/ 05 октября 2011

У меня нет способа проверить это прямо сейчас, но ksh (возможно, bash тоже) может охватывать переменные внутри функций.

z()
{
   typeset result
   user=$1
   type=$2
   if [[ $type = "customer" ]]; then
      result=$(/somedir/someapp -u $user)
      if [[ $result = "" ]]; then
         #something goes wrong
         #I do not want to continue
         #I want to stop whole script
         exit 1
      else
         print $result
      fi
   else
      print "worker"
   fi
}

Обратите внимание на вставку typeset result в верхней части.

Для работы этой функции может потребоваться использование альтернативного объявления функции, т. Е.

 function z {
    #....
  }

Надеюсь, это поможет.

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

  result=$(z ; "eval retCode=\$? ; echo \$retCode" )
...