Возможно ли для функции Bash вывести значение в дескриптор файла и присвоить только это значение переменной? - PullRequest
1 голос
/ 08 ноября 2019

Я хотел смоделировать возвращаемое значение для функции Bash, и мне было интересно, можно ли использовать дескриптор файла adhoc для передачи значения.

Другими словами:

function myfunction {
  # print `stdout_value` to stdout
  # print `stderr_value` to stderr
  # print `return_value` to FD3 (or other)
}

# the values printed to stderr/stdout should be printed, but only
# `return_value` should be assigned to `myvalue`
myvalue=$(myfunction <FDs manipulation>)

Ответы [ 2 ]

4 голосов
/ 08 ноября 2019

Да, это так. Но для этого сначала нужно сохранить stdout в другом дескрипторе для всего вызова и для подстановки команд;перенаправить 3 на его stdout - так, что записанное в него может быть захвачено - и его stdout на stdout всего вызова. Например:

{ myvalue=$(myfunction 3>&1 1>&4); } 4>&1

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

  • используйте stderr для сообщения об ошибках, предупреждениях и отладочной информации (включая журналы и приглашения),
  • используйте stdout для отображения результатов,
  • и используйте оператор return для обозначения общего успеха / неудачи.
3 голосов
/ 08 ноября 2019

Вероятно, проще всего сначала сделать глобальную копию стандартного вывода. Например:

#!/bin/sh

exec 4>&1
myfunction() {
        echo stdout
        echo stderr >&2
        echo fd3 >&3
} 3>&1 1>&4


v=$(myfunction)   # assigns the string "fd3"
echo v="$v"
...