关于shell:将命令输出重定向到ksh中的变量和标准输出

redirect command output into variable and standard output in ksh

我有一些命令。我想将输出写入标准输出并保存到变量中。我想用一个命令来解决这个问题。我试过这些东西。

1
2
3
4
ls > $VAR          # redirects the output to file which name is stored in $VAR
ls | tee -a $VAR   # writes to standard output as well as in file which name is stored in $VAR
VAR=`ls`           # output into $VAR, but it is not sent to standard output
VAR=`ls`;echo $VAR # ok, it works but these are two commands

有什么想法吗?


怎么样:

1
VAR=$(ls | tee /dev/tty)


@gary_barker的回答很好,但这在所有系统上都是不可能的。

在我们的TeamCity上没有char控制台。还有一个小问题。

如果我使用

VAR=$(ls -1); echo $VAR

它和ls -1不同

如果不重要的话,我的解决方案是有效的,输出来自错误管道。

VAR=$(ls -1 | tee >&2)


据我所知,VAR=`ls`;echo $VAR没问题,但你不喜欢,因为它有两个命令。

当@gary barker工作时,我没有检查所有系统。如果你对tee或其他的有问题,你可以建立你自己的永远。

我不知道你是否知道,但是在Linux上可以使用的很多程序只是一堆在系统上使用小二进制的代码。虽然这是真的,但是使用1或2个逗号是没有意义的,因为最终的执行实际上是一堆小的逗号。

因此,如果您真正的问题是只能在目标中编写一个命令,那么您可以编写自己的"app",方法是将/sbin文件夹中的sh脚本设置为不带.sh扩展名(因为这些脚本的前缀是./或sh,而不是名称)。

我写了这个例子:

#!/bin/bash
if [ $1 ]
then
VAR=$*; echo $VAR
fi

对于这个示例,我已经将文件/sbin/varrun设置为。我用成功(正常)输出的以下命令进行了尝试:

  • varrun ls
  • varrun uname
  • varrun uname -a

请注意,我没有在带有空格的命令上使用"引号"。