在bash中将命令输出重定向到变量和控制台同时输出不起作用。
在bash中将命令输出重定向到变量和控制台同时输出不起作用。
我有一个简单的任务要在shell脚本中完成-将命令输出重定向到一个变量以及标准输出。我已经阅读了在ksh中将命令输出重定向到变量和标准输出,并且得到了以下解决方案:\n
VAR1=$(ps -u "${USER}" | awk 'NR>1 {print $NF}' | tee > /proc/$$/fd/1)
\n然而上述方法对我无效。输出可以正常显示在STDOUT
上,但没有保存在VAR1
中。我在这里漏掉了什么?
在bash中将命令输出重定向到变量和控制台上的问题:
问题原因:
这个问题是因为使用了错误的重定向命令。原来的命令使用了>
将tee命令的输出重定向到了/dev/stderr
,而正确的做法应该是使用/dev/tty
或者/dev/stderr
来将输出写入控制台。
解决方法:
正确的解决方法是使用以下命令:
var1=$(ps -u "${USER}" | awk 'NR>1 {print $NF}' | tee /dev/tty)
或者
var1=$(ps -u "${USER}" | awk 'NR>1 {print $NF}' | tee /dev/stderr)
这样就可以将命令的输出保存到变量var1
中,并且同时在控制台上显示输出。
需要注意的是,为了避免覆盖环境变量,建议避免使用全大写的变量名。
这两个命令在OSX和Ubuntu上都可以正常工作。
然而,如果直接将输出发送到/dev/tty
,就无法将其重定向或者管道到标准输出中。
另外,有用户反馈说这个方法对于KSH和Bash都不起作用。对于这种情况,可能是因为用户在默认shell中运行命令时出现了问题。对于这种情况,需要进一步排查原因。
以上就是关于在bash中将命令输出重定向到变量和控制台的问题的原因和解决方法。通过使用正确的重定向命令,可以将命令的输出保存到变量中,并且同时在控制台上显示输出。需要注意避免使用全大写的变量名来避免覆盖环境变量。这个方法在OSX和Ubuntu上都可以正常工作,但对于其他操作系统和不同的shell可能会有不同的结果。
问题:在bash中,将命令输出重定向到变量和控制台不起作用。
原因:在tee命令上有一个不必要的重定向。tee命令的作用是将输入复制到输出,并将副本复制到作为参数给出的任何文件中。重定向仅会干扰其传递行为。
解决方法:您可以采取另一种方法——因为我们在这里不讨论长时间运行的命令——先设置变量,然后打印其值。这样会简化很多。
代码示例:
VAR1=$(ps -u "${USER}" | awk 'NR>1 {print $NF}') echo "$VAR1"
这样,您可以首先将命令的输出存储在变量VAR1中,然后使用echo打印出该变量的值。这样就实现了将命令输出重定向到变量和控制台的效果。