当将bash重定向到stdout或stderr时,我实际上被重定向到一个文件

时间:2014-07-29 15:05:25

标签: bash redirect ssh stdout stderr

我通过ssh保存在远程执行的一个命令的输出,但我也执行了一些回声。为了在屏幕上看到消息而不将它们保存到变量我要重定向它们。 我尝试了>& 1和>& 2但是在每种情况下都创建了一个名称为" 1"或" 2" 这是扩大引号还是逃避字符的问题?

OUTPUT=$(sshpass -p password ssh user@ip 'echo "Message1" >&2 ;
                                          su -lc "./rootscript.sh" >&2; 
                                          echo "$?" ')
echo "su output is: $OUTPUT"

输出:

屏幕上没有任何内容,名为" 2"用文字"密码"在内部(假设消息1被覆盖)程序仍然等待密码,即使没有提示,所以当我输入它时输出是好的:

su output is: 0

如何在屏幕上显示我的消息?

1 个答案:

答案 0 :(得分:1)

@JonathanLeffler马上发现了问题 - 你没有使用bash,而是使用tcsh。

tcsh有自己的语法与bash不兼容。

尽管如此:由于sshsshpass会返回远程命令的退出代码,因此您应该这样做:

if sshpass -p password ssh user@ip 'echo "Message1"; su -lc "./rootscript.sh"'
then
  echo "The command succeeded (exit code $?)"
else
  echo "The command failed (exit code $?)"
fi

如果你真的想在远程shell上使用bash运行某些东西,你可以使用Charles Duffy的代码进行微小改动:

                                      #    v-- shell specified here
output=$(sshpass -p password ssh user@ip bash << 'EOF'
   echo "Message1" >&2
   su -lc "./rootscript.sh" >&2 
   echo "$?"
EOF
)