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

26

我有一些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

有什么想法吗?


只是好奇为什么有一行限制。这让我觉得你不是系统目标的根,也是用户之一。我想不出为什么你会有这个限制。无论如何,我已经给你发布了一个“自己做”的答案。 - m3nda
3个回答

59

怎么样:

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

根据您的操作系统,“var = $(ls | tee / proc / $$ / fd / 1)”也可能有效。 - glenn jackman
即使这个程序完美运行,我也会给你一个“自己动手”的示例。虽然我是一个 Linux/bash 新手,但我喜欢学习这些技巧 :D - m3nda
请注意,这个(tee)只能捕获标准输出,并且程序通常不会对其进行着色(即使用VAR = $(ls --color | tee /dev/tty)来获取彩色输出)。 - rugk

3

@Gary_Barker给出了很好的答案,但并非所有系统都可行。

在我们的teamcity上没有字符控制台。 而且还有一个小问题。

如果我使用

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

它与 ls -1 不同

我的解决方案可行,如果输出来自错误管道不要紧。

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


1
如果输出结果有多行,请确保对 echo 命令使用双引号。例如:VAR=$(ls -1); echo "$VAR"。否则所有内容将会被压缩到同一行。 - hoss
@hoss,你能解释一下为什么会发生这种情况吗? - Prabhat Kumar Singh

0

据我所知,VAR=`ls`;echo $VAR是可以的,但你不喜欢它,因为它有两个命令。

当@Gary-Barker在工作时,我没有检查所有系统。如果你在使用tee或其他命令时遇到问题,你可以自己构建。

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

因此,如果你真正的问题是你只能在目标中编写单个命令,那么你可以通过在/sbin文件夹中创建一个sh脚本并将其保留为.sh扩展名(因为这些是通过./或sh前缀而不是名称来执行的)来编写自己的“应用程序”。

我写了一个例子:

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

对于这个例子,我已经创建了文件/sbin/varrun。我尝试使用以下命令,并成功(正常)输出:

  • varrun ls
  • varrun uname
  • varrun uname -a

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接