關於shell命令的定向輸出 2>&1 .

分類: 腳本與批處理 2006-08-23 15:13 3473人閱讀 評論(0) 收藏 舉報
mycommand >mylog.txt 2>&1 應該是最經典的用法了。

命令的結果可以通過“%>”的形式來定向輸出,%表示文件描述符:1爲標準輸出stdout、2爲標準錯誤stderr。系統默認%值是1,也就是“1>”,而1>可以簡寫爲>,也就是默認爲>。stdout的默認目標是終端,stderr的默認目標爲也是終端。我們在批處理中執行: echo text >result.txt ,我們就可以在屏幕上會看到 echo text 1>result.txt ,即是這個道理。

其中&需要直接與重定向符號結合使用。

參考:
1、http://www.google.cn/search?q="2>%261"
2、http://www.microsoft.com/technet/prodtechnol/windowsserver2003/zh-chs/library/ServerHelp/04969a04-a424-4776-bdc7-dc5066ce79b2.mspx?mfr=true

應用實例:

1、將結果輸出到result.txt
net stop myservices >>result 2>&1

2、隱藏程序輸出結果
net stop myservices >nul 2>nul


--------------------------------------------------------------------------------
微軟關於重定向的文章:

使用命令重定向操作符
更新日期: 01/21/2005
使用命令重定向操作符
可以使用重定向操作符將命令輸入和輸出數據流從默認位置重定向到其他位置。輸入或輸出數據流的位置稱爲句柄。

下表將列出可用的句柄。



句柄 句柄的數字代號 描述
STDIN
0
鍵盤輸入

STDOUT
1
輸出到命令提示符窗口

STDERR
2
錯誤輸出到命令提示符窗口

UNDEFINED
3-9
句柄由應用程序單獨定義,它們是各個工具特有的





數字 0 到 9 代表前 10 個句柄。可以使用命令 Cmd.exe 運行程序,並對該程序前 10 個句柄中的任何一個句柄進行重定向。要指定要用的句柄,請在重定向操作符之前鍵入該句柄的數字。如果未定義句柄,則默認的 < 重定向輸入操作符是 0,而默認的 > 重定向輸出操作符是 1。鍵入 < 或 > 操作符之後,必須指定數據的讀寫位置。可以指定文件名或其他現有的句柄。

要指定重定向到現有句柄,請使用與 (&) 字符,後面接要重定向的句柄號(即 &句柄號)。例如,下面的命令可以將句柄 2(即 STDERR)重定向到句柄 1(即 STDOUT):

2>&1

下表列出了可用於重定向輸入和輸出數據流的操作符。



重定向操作符 描述
>
將命令輸出寫入到文件或設備(如打印機),而不是命令提示符窗口或句柄。

<
從文件而不是從鍵盤或句柄讀入命令輸入。

>>
將命令輸出添加到文件末尾而不刪除文件中已有的信息。

>&
將一個句柄的輸出寫入到另一個句柄的輸入中。

<&
從一個句柄讀取輸入並將其寫入到另一個句柄輸出中。

|
從一個命令中讀取輸出並將其寫入另一個命令的輸入中。也稱作管道。





默認情況下,可以從鍵盤將命令輸入(即 STDIN 句柄)發送到 Cmd.exe,然後由 Cmd.exe 將命令輸出(即 STDOUT 句柄)發送到命令提示符窗口。

重定向輸入 (<)
要通過鍵盤將輸入重定向到文件或設備,請使用 < 操作符。例如,要從 File.txt 獲取 sort 命令的輸入,請鍵入:

sort<file.txt

File.txt 的內容將以字母順序列表的方式顯示在命令提示符窗口中。

< 操作符可以打開具有隻讀訪問權限的指定文件名。因此,不能在使用該操作符時向文件中寫入信息。例如,如果以 <&2 啓動程序,則所有試圖讀取句柄 0 的操作都將失敗,因爲句柄 2 最初是以只寫訪問方式打開的。

注意


• 0 是 < 重定向輸入操作符的默認句柄。



重定向輸出 (>)
幾乎所有的命令都將輸出發送到命令提示符窗口。即使將輸出發送到驅動器或打印機的命令也會在命令提示符窗口顯示消息和提示。

要將輸出從命令提示符窗口重定向到文件或設備,請使用 > 操作符。可以在許多命令中使用該操作符。例如,要將 dir 輸出重定向到 Dirlist.txt,請鍵入:

dir>dirlist.txt

如果 Dirlist.txt 不存在,Cmd.exe 將創建該文件。如果 Dirlist.txt 存在,Cmd.exe 將使用 dir 命令的輸出替換文件中的信息。

要運行 netsh routing dump 命令,然後將輸出發送到 Route.cfg,請鍵入:

netsh routing dump>c:/route.cfg

> 操作符可以打開具有隻寫訪問權限的指定文件。因此,不能使用該操作符讀取文件。例如,如果使用重定向操作符 >&0 啓動程序,則寫入句柄 1 的所有嘗試操作都將失敗,因爲句柄 0 最初是以只讀訪問方式打開的。

注意


• 1 是 > 重定向輸出操作符的默認句柄。



複製句柄
重定向操作符 & 可以將輸出或輸入從一個指定句柄複製到另一個指定的句柄。例如,要將 dir 輸出發送到 File.txt 並將錯誤輸出發送到 File.txt,請鍵入:

dir>c:/file.txt 2>&1

複製句柄時,可以複製該句柄原狀態的所有特性。例如,如果一個句柄具有隻讀訪問的屬性,則該句柄的所有副本都具有隻讀訪問屬性。不能將一個具有隻讀訪問屬性的句柄複製到另一個具有隻寫訪問屬性的句柄。

使用 & 操作符重定向輸入和副本
要將重定向輸入操作符 (<) 與複製操作符 (&) 結合使用,指定的文件必須已經存在。如果輸入文件存在,Cmd.exe 將以只讀方式打開該文件,然後將文件包含的字符作爲輸入發送到此命令(如同從鍵盤輸入一樣)。如果指定了句柄,Cmd.exe 將指定的句柄複製到系統現有的句柄中。

例如,要以句柄 0 輸入讀取(即 STDIN)的方式打開 File.txt,請鍵入:

<file.txt

要打開 File.txt,並在內容排序後將輸出發送到命令提示符窗口(即 STDOUT),請鍵入:

sort<file.txt

要查找 File.txt,然後將句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到 Search.txt,請鍵入:

findfile file.txt>search.txt 2<&1

要以句柄 0 輸入讀取(即 STDIN)的方式複製用戶定義的句柄 3,請鍵入:

<&3

使用 & 操作符重定向輸出和複製
如果將輸出重定向到文件且指定了現有的文件名,Cmd.exe 將以只寫方式打開文件並覆蓋該文件內容。如果指定了句柄,Cmd.exe 將文件複製到現有句柄中。

要將用戶定義的句柄 3 複製到句柄 1,請鍵入:

>&3

要將包括句柄 2(即 STDERR)的所有輸出從 ipconfig 命令重定向到句柄 1(即 STDOUT),然後將輸出重定向到 Output.log,請鍵入:

ipconfig.exe>>output.log 2>&1

使用 >> 重定向操作符附加輸出
要從命令中將輸出添加到文件末尾而不丟失文件中已存在的任何信息,請使用兩個連續的大於號(即 >>)。例如,使用下列命令可以將 dir 命令生成的目錄列表附加到 Dirlist.txt 文件:

dir>>dirlist.txt

要將 netstat 命令的輸出附加到 Tcpinfo.txt 的末尾,請鍵入:

netstat>>tcpinfo.txt

使用管道操作符 (|)
管道操作符 (|) 可以提取一個命令的輸出(默認情況下是 STDOUT),然後將其定向到另一個命令的輸入(默認情況下是 STDIN)中。例如,使用下面的命令可以對目錄進行分類:

dir | sort

在本例中,將同時啓動兩個命令,但隨後 sort 命令會暫停,直到它接收到 dir 命令的輸出爲止。sort 命令使用 dir 命令的輸出作爲輸入,然後將輸出發送到句柄 1(即 STDOUT)。

合併帶重定向操作符的命令
通過合併帶有其他命令和文件名的篩選器命令,可以創建自定義命令。例如,可以使用以下命令存儲包含“LOG”字符串的文件名:

dir /b | find "log" loglist.txt

dir 命令的輸出是通過 find 篩選器命令進行發送的。包含字符串“LOG”的文件名作爲文件名列表(例如,NetshConfig.log、Logdat.svd 和 Mylog.bat)存儲在文件 Loglist.txt 中。

要在相同命令中使用多個篩選器,請使用管道 (|) 分隔篩選器。例如,下面的命令將搜索 C 盤上的每個目錄以查找包含“LOG”字符串的文件名,並且在命令提示符窗口中每次顯示一屏:

dir c:/ /s /b | find "log" | more

利用管道 (|) 可以對 Cmd.exe 進行定向,使其通過 find 篩選器命令發送 dir 命令輸出。find 命令只選擇包含字符串“LOG”的文件名。more 命令可以顯示 find 命令選擇的文件名(在命令提示符窗口中每次顯示一屏)。有關篩選器命令的詳細信息,請參閱使用篩選器。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章