定义变量的值为某个命令执行结果

#!/usr/bin/env bash
time=$(date)
nginxConfigPath=$(nginx -t)
echo 'datetime' $time
echo 'config path' $nginxConfigPath

执行上述的shell脚本文件,结果为

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
datetime Fri Nov 16 14:27:14 CST 2018

理论上变量nginxConfigPath应该有值。
实际结果时,nginx -t命令结果在定义时已经显示结果。

阅读 2.7k
1 个回答

abc=$(cmd)这种方式只能获得标准输出的转向. nginx 输出是标准错误输出, 所以不能得到.

以下实验可以验证

$ date >a.txt
$ cat a.txt
2018年11月16日 星期五 21时01分20秒 CST


$ sudo nginx -t >a.txt  #没有成功转向
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
$ cat a.txt #无输出 


$ sudo nginx -t 2>a.txt   #成功转向
$ cat a.txt 
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

如想获得标准错误输出可以用如下方式

nginxConfigPath=$(nginx -t 2>&1)

文件描述符1是标准输出(stdout)。
文件描述符2是标准错误(stderr)。

这里是要记住这个结构(尽管它并不完全准确)的一种方法:首先,2>1可能看起来像重定向的stderr到stdout。但是,它实际上将被解释为“重定向stderr到名为1” 的文件。&表示后面是文件描述符而不是文件名。所以变成:2>&1。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进