如何隐藏shell命令的信息将打印并保存到变量?

How to hide the information of shell command will print and save it to a variable?

本问题已经有最佳答案,请猛点这里访问。

我想在shell脚本中使用git pull,它会打印"已经是最新的",但我不想打印它。我想将这些消息保存到一个变量中。怎么做?非常感谢!

更新:
? gitvar=$(git checkout alpha)
Already on 'alpha'
? echo $gitvar
M _gg.sh
M _posts/2018-10-22-about.md
我想将"alpha"上的"already"保存到变量"gitvar"。$(…)没有。这和zsh有什么关系吗?

更新:我很抱歉。我以前不知道stdout和stderr。谢谢你告诉我这个。问题的答案是命令的打印可能是stdout,也可能是stderr。
1 output=$(command) # stdout only; stderr remains uncaptured
2 output=$(command 2>&1) # both stdout and stderr will be captured


可以通过两种方式将命令的标准输出保存到变量:

1
2
a=`git pull`
a=$(git pull)

后者更容易筑巢,例如:

1
a=$(ls $(pwd))

但是,您应该注意,程序通常在两个流上打印消息:stdoutstderr。例如,git pull将在stdout上打印Already up-to-date,这将被上述命令正确捕获。fatal: not a git repository等错误信息打印在stderr流上。为了将所有输出捕获到变量中,需要将stderr重定向到stdout中:

1
a=`git pull 2>&1`

相应地,12对应于stdoutstderr


正如auxilus所指出的,可以使用命令替换(例如$(...))捕获变量中命令的输出。然后可以将$(...)中命令的输出分配给变量,例如

1
$ gitvar=$(git pull)

上面,来自git pull的输出现在存储在gitvar中。如果您想在日志文件中使用它,那么可以将日期提前到输出,从而允许维护按时间顺序排列的日志。好的日志日期格式是"%b %e %T"(例如Dec 30 04:36:22)。创建您的logvar是一个简单的事情,它将日期预先呈现到字符串中,并添加gitvar的内容,例如。

1
2
3
$ logvar="$(date +"%b %e %T") - $gitvar"
$ echo"$logvar"
Dec 30 04:36:36 - already up to date

然后,您可以将输出重定向到您选择的任何日志,或者根据需要使用原始的gitvar


你可以这么做

1
var=$(command)

以及访问var,例如

1
echo $var