Shell 将命令输出重定向到ksh中的变量和标准输出

Shell 将命令输出重定向到ksh中的变量和标准输出,shell,scripting,ksh,Shell,Scripting,Ksh,我有一些shell命令。我想将输出写入标准输出,并将其保存到变量中。 我想用一个命令来解决它。 我试过这些东西 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`

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

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
有什么想法吗?

怎么样:

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个逗号是没有意义的,因为最终的执行实际上是一堆小逗号

因此,如果您真正的问题是您只能在目标中编写一个命令,那么您可以编写自己的“应用程序”,方法是在/sbin文件夹中创建一个sh脚本,而不使用.sh扩展名(因为这些脚本的前缀是./or sh,而不是名称)

我写了这个例子:

#/bin/bash
如果[$1]
然后
VAR=$*;echo$VAR
fi

对于本例,我将文件设为/sbin/varrun。我已经尝试过使用folling命令成功(正常)输出:

  • varrun ls
  • varrununame
  • varrununame-a

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

根据您的操作系统,
var=$(ls | tee/proc/$$/fd/1)
可能也会起作用。即使这样做很好,我也会给您举一个“自己动手”的例子。我是一个Linux/bash noob,但我喜欢学习这些技巧:请注意,这个(tee)只捕获标准输出,而程序通常不会对其进行着色(即使用
VAR=$(ls--color | tee/dev/tty)
,以获得着色输出)。只是对1行限制感到好奇。这让我觉得你不是系统目标的根,也不是系统目标的用户。我不明白你为什么有这样的限制。不管怎样,我已经给你发了一个“自己做”的答案。如果结果不止一行,请确保重复引用回音<代码>变量=$(ls-1);回显“$VAR”。否则它会被挤成一个单一的line@hoss你能解释一下为什么会这样吗?