Сохранить вывод команды grive в переменную в скрипте bash

Я пытаюсь создать скрипт, который синхронизирует мой компьютер с Google Drive с помощью инструмента grive. Я хотел бы сохранить выходные данные grive команда для переменной bash, но я не могу заставить ее работать.

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

VARABLENAME=$(command)

и результат может быть позже напечатан

echo ${VARIABLENAME}

Тем не менее, команда grive, кажется, является исключением из этого, потому что, когда я использую этот синтаксис, она все равно печатает выходные данные в терминале, а содержимое переменной пусто.

Как я могу сохранить вывод grive в переменной правильно?

1 ответ

Решение

Проблема заключалась в том, что grive команда выводила в поток ошибок STDERR (дескриптор файла 2), который обычно используется для передачи сообщений об ошибках, а STDOUT (дескриптор файла 1) используется для отображения фактического (при успешном завершении) вывода любой программы (строго говоря).

Я не пользовалась grive, но, по вашим словам, разработчик мог использовать STDERR только для отображения каких-либо сообщений от команды.

Теперь подстановка команды, которую вы использовали:

VARABLENAME=$(command)

спасет выведение из command в VARABLENAME, не STDERR. В результате переменная была пуста, и вы видели сообщения на терминале.

Я предложил:

VARABLENAME="$(command 2>&1)"

это сохранит STDOUT и STDERR в переменную (в вашем случае просто STDERR, так как нет STDOUT), поэтому вы получите желаемый результат, используя echo "${VARIABLENAME}",

Кроме того, поскольку нет STDOUT, вы можете сохранить только STDERR в переменной (обобщение, верно для любой такой программы):

VARABLENAME="$(command 2>&1 >/dev/null)"
Другие вопросы по тегам