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
- 旁白:避免在脚本中使用git pull;而是使用git pull将运行的两个git命令。这样你就能得到适当的控制。
- @Torek谢谢你的评论,"使用两个git命令"是什么意思?
- @eitrigg,git pull为git fetch和git merge。把另外两个结合在一起不会有任何效果。
- 顺便说一句,你的"alpha已经在"是stderr,而不是stdout,这就是为什么它没有被捕获的原因…这就是我们现有的许多关于同一问题的知识库条目所说的。这也包含在bashfaq 2中。
可以通过两种方式将命令的标准输出保存到变量:
1 2
| a=`git pull`
a=$(git pull) |
后者更容易筑巢,例如:
但是,您应该注意,程序通常在两个流上打印消息:stdout和stderr。例如,git pull将在stdout上打印Already up-to-date,这将被上述命令正确捕获。fatal: not a git repository等错误信息打印在stderr流上。为了将所有输出捕获到变量中,需要将stderr重定向到stdout中:
相应地,1和2对应于stdout和stderr。
- 好答案。请注意,今天美元(…)符号比倒勾符号更受欢迎。
- 用A=$(ls $(PWD))代替A=$(ls $(PWD))。PWD是一个系统外壳变量,使用小写变量作为自己的变量名。
- @沃尔特拉,对,谢谢。无论如何,这个例子有点愚蠢。
- …好吧,在现实生活中,我们使用ls"$PWD";毫无意义地生成一个子shell,只是运行一个命令,该命令会发出一个内置变量中已经存在的值。
正如auxilus所指出的,可以使用命令替换(例如$(...))捕获变量中命令的输出。然后可以将$(...)中命令的输出分配给变量,例如
上面,来自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。
- 非常感谢,我已经试过了,但没用,结果是:? gitvar=$(git checkout alpha) Already on 'alpha' ? echo $gitvar M _gg.sh M _posts/2018-10-22-about.md。
- 我不明白。如果您执行git pull,它将报告"Already up-to-date.",或者返回写入stderr的"remote: Enumerated objects.."和更新的文件列表。(如:"Updating 6e76e48..0ec1232 Fast-forward..."号)写入stdout号。使用$ gitvar=$(git pull)只捕获写入stdout的信息。如果要同时捕获这两个文件,请使用$ gitvar=$(git pull 2>&1)将stdout和stderr都写入gitvar。
- 如果不希望输出的某些部分,则可以始终使用head或tail从开始或结束处修剪线条,或使用sed根据某种模式匹配从中间修剪线条。
你可以这么做
以及访问var,例如
- 在如何回答问题时,请注意"回答好的问题"一节,以及其中有关"之前已经被问过和回答过多次"的问题的要点。