我正在尝试创建一个脚本,使用以下命令将我的计算机与 Google Drive 同步格里夫工具。我想将grive
命令的输出存储到 bash 变量中,但似乎无法让它工作。
一些谷歌搜索告诉我,可以使用以下语法将命令输出保存到变量中:
VARABLENAME=$(command)
稍后可以通过以下方式打印输出
echo ${VARIABLENAME}
但是,grive 命令似乎是个例外,因为当我使用这种语法时,它仍然会在终端中打印出输出,并且变量的内容为空。
我如何才能正确地将输出存储grive
在变量中?
答案1
问题是grive
命令输出到错误流 STDERR(文件描述符 2),它通常用于传递错误消息,而 STDOUT(文件描述符 1)用于显示任何程序的实际(成功时)输出(严格来说)。
我没有使用过grive
,但根据你的说法,开发人员可能仅使用 STDERR 来显示来自命令的任何消息。
现在您使用的命令替换:
VARABLENAME=$(command)
会将 的 STDOUT 保存command
到VARABLENAME
,而不是 STDERR。因此变量为空,您会在终端上看到消息。
我建议:
VARABLENAME="$(command 2>&1)"
这会将 STDOUT 和 STDERR 都保存到变量中(在您的情况下仅为 STDERR,因为没有 STDOUT),因此您可以使用获得所需的结果echo "${VARIABLENAME}"
。
此外,由于没有 STDOUT,您可以将 STDERR 保存到变量中(概括而言,对于任何此类程序都是正确的):
VARABLENAME="$(command 2>&1 >/dev/null)"