2011-10-26 75 views
19

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

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 

任何想法?

+0

只是好奇1线的限制。这使得我不仅仅是系统目标用户的根源。我无法弄清楚为什么你有这个限制。无论如何,我已经发布给你一个“你自己”的答案。 – erm3nda

回答

46

如何:

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

它的工作原理,非常感谢。 –

+0

根据您的操作系统,'var = $(ls | tee/proc/$$/fd/1)'也可能工作。 –

+0

即使这是完美的工作,我发布给你一个“自己动手的方式”的例子。 我是一个Linux/bash noob,但我喜欢学习这些技巧:D – erm3nda

3

从@Gary_Barker伟大的答案,但是这是不可能在所有系统上。

在我们的团队中,没有一个字符控制台。 还有一个小问题。

如果我使用

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

它是不一样的喜欢ls -1

我的解决办法工作,如果它没有关系,使输出来自错误管道。

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

+0

如果结果不止一行,请确保双引号回显。 'VAR = $(ls -1);回声“$ VAR”'。否则它会变成一条线 – hoss

+0

@hoss你能解释为什么会发生这种情况吗? –

0

据我了解,VAR=`ls`;echo $VAR是确定的,但你不喜欢,因为有这两个命令。

虽然@加里巴克正在工作,我还没有检查所有系统。如果你有问题或其他问题,你可以建立自己的总是。

我不知道你是否知道,但在Linux上可以使用的很多程序只是使用系统上的小二进制代码的一堆代码。 虽然这是真的,但是没有关于使用1或2个命令的意义,因为最终的执行实际上是一堆小命令。因此,如果你真正的问题是你只能在你的目标中写入一个命令,你可以编写你自己的“app”,通过在/ sbin文件夹中创建一个sh脚本,使其不用.sh扩展名(因为这些都是由名以./或SH前缀,而不是excecuted)

我写的例子:

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

在这个例子中,我有使文件/ sbin目录/ varrun。我受够了folling命令试图将其与成功(正常)输出:

  • varrun ls
  • varrun uname
  • varrun uname -a

请注意,我没有用 “引号” 的命令与空间。