2011-10-26 155 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

請注意,我沒有用 「引號」 的命令與空間。