我以前做过这个。
我在这个论坛上阅读了很多帖子,并且搜索了更多关于如何将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,并且想要理解为什么它没有做我期望它做的事情。谢谢!
答案 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
对我有用。