为什么我没有将shell命令的结果保存到我的变量中?

时间:2017-11-11 02:00:57

标签: bash shell

我以前做过这个。

我在这个论坛上阅读了很多帖子,并且搜索了更多关于如何将shell命令的结果保存到变量中的信息。所有人都说这样做

VAR="$(shell_command)"
echo $VAR

VAR=`shell_command`
echo $VAR

但我正在尝试这样做

VAR="$(python2.7 -V)"
echo "Version is $VAR"

VAR=`python2.7 -V`
echo "Version is $VAR"

我看到了

Python 2.7.14
Version is

我是不是要存储结果?为什么是这样?我只想要纯粹的bash,并且想要理解为什么它没有做我期望它做的事情。谢谢!

2 个答案:

答案 0 :(得分:1)

在这种特殊情况下,它是因为Python将版本打印到其标准错误流。 @Component(value = "customAuthenticationSuccessHandler") public class CustomAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { private static final Logger LOGGER = Logger.getLogger(CustomAuthenticationSuccessHandler.class); @Autowired private IUserRepository userRepository; @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { if (hasRoleCustomer(authentication)) { String username = authentication.getName(); User user = userRepository.findByUsername(username); response.setStatus(HttpServletResponse.SC_OK); response.getWriter().print(user.getId()); LOGGER.info("Authentication Success for customer : "+user.getUsername()+", with id : "+user.getId()); } else { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); response.getWriter().print("Access Denied, please contact the administrator."); LOGGER.info("Access denied for customer : "+authentication.getName()); } response.getWriter().flush(); } 构造(或反引号)仅捕获给定命令发送到标准输出的内容。

在这种情况下,你可以通过编写$(...)来解决这个问题。这里$(python2.7 -V 2>&1)是shell代码,意味着"用标准输出流的副本替换标准错误流"所以任何Python 认为它写入的内容标准错误实际上发送到标准输出的目的地。

请注意,在某些情况下,报价使用不当可能会导致类似问题。一般来说,用双引号括起命令替换是个好主意:

2>&1

虽然在这种情况下并不重要。

答案 1 :(得分:1)

试试这个:

python2.7 -V >/dev/null

您仍然会看到输出,这意味着版本信息不会发送到标准输出(标准输出)。

而且:

python2.7 -V 2>/dev/null

输出消失,进一步确认它已发送到标准错误。

所以你想这样做:

VAR="$(python2.7 -V 2>&1)"
#                  ^^^^
# Redirect stderr to stdout

对我有用。