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

时间:2018-12-30 10:16:12

标签: shell

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


更新: ➜ gitvar=$(git checkout alpha) Already on 'alpha' ➜ echo $gitvar M _gg.sh M _posts/2018-10-22-about.md 我想将“已经在“ alpha”上”保存为变量“ 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

3 个答案:

答案 0 :(得分:2)

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

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

后者更易于嵌套,例如:

a=$(ls $(pwd))

但是,您应该注意,程序通常在两个流上打印消息:stdoutstderr。例如。 git pull将在Already up-to-date上打印stdout,以上命令将正确捕获该fatal: not a git repository。诸如stderr之类的错误消息将打印在stderr流上。为了将所有输出捕获到变量中,您需要将stdout重定向到a=`git pull 2>&1` 中:

1

数字2stdout分别对应于stderr<Exit xmlns="http:--tempuri-org-">

答案 1 :(得分:0)

您可以通过

var=$(command)

并访问

之类的var
echo $var

答案 2 :(得分:0)

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

$ gitvar=$(git pull)

上面,git pull的输出现在存储在gitvar中。如果您想在日志文件中使用它,则可以在输出之前加上日期,以保留按时间顺序排列的日志。良好的日志日期格式为"%b %e %T"(例如Dec 30 04:36:22)。创建日期logvar很简单,只需在字符串前加上日期,然后添加gitvar的内容,例如

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

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