我在腳本中看到了這一行:
DEVICE=`dialog --inputbox "Festplatten-Laufzeit auslesen. Gebe Sie das
gewünschte Device an: " 0 70 "" 3>&1 1>&2 2>&3`
什麼是
3>&1 1>&2 2>&3
正在做?我知道 1 = stdout 和 2 = stderr,但 the3
和&
for 是什麼?
答案1
這些數字是文件描述符,只有前三個(從零開始)具有標準化意義:
0 - stdin
1 - stdout
2 - stderr
因此命令中的每個數字都指一個檔案描述符。您可以將文件描述符重定向到一個文件>
,或將其重定向到另一個文件描述符>&
3>&1
命令列中的 將會建立一個新的檔案描述符並將其重定向1
到STDOUT
.現在1>&2
將檔案描述符 1 重定向到STDERR
並將2>&3
檔案描述符 2 重定向到 3,即STDOUT
.
所以基本上你切換了STDOUT
和STDERR
,這些是步驟:
- 建立一個新的fd 3並將其指向fd 1
- 將檔案描述符 1 重定向到檔案描述符 2。
- 將檔案描述符 2 重新導向到檔案描述符 3。
現在,如果程式將某些內容列印到文件描述符 1,它將列印到文件描述符 2,反之亦然。
答案2
它正在交換stdout
和stderr
。
>name
表示將輸出重定向到檔案name
。
>&number
意味著將輸出重定向到檔案描述符number
。
因此&
需要告訴 shell 您指的是檔案描述符,而不是檔案名稱。
文件描述符是指一個已經開啟的檔案的數字。標準0
用於標準輸入、1
標準輸出或2
標準誤差。您也可以使用任何其他數字,這將建立一個新的檔案描述符,就像您使用 . 建立新變數一樣var=value
。
預設情況下,檔案描述符1
和2
go to都是如此/dev/tty
,因此如果您somecommand 3>&1 1>&2 2>&3
在新 shell 中運行,它不會更改任何內容(除了現在您的檔案描述符編號為 3)。
但是,如果腳本中較早的某個位置使用 exec 進行重定向(例如exec 2>error.log
),或者腳本使用包含重定向的命令列執行(例如./thescript 2>error.log
),則交換 stdout 和 stderr 將會執行某些操作。
在您的特定情況下,交換 stdout 和 stderr 的命令是dialog
.看著它的手冊頁, 我懂了
Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error
因此,也許編寫腳本的人希望dialog
將輸出轉至stdout
而不是stderr
出於某種原因。
也可以看看重定向順序
答案3
腳本編寫者定義了 fd 3,例如:
exec 3<> File.txt
打開“File.txt”並將 fd 3 分配給它。最大檔案描述符:255
read -n 4 <&3
只讀 4 個字元。
echo -n . >&3
在那裡寫下一個小數點。
exec 3>&-
關閉 fd 3。
cat File.txt
==> 1234.67890
答案4
我透過下面的範例理解了檔案描述符和「3> & 1 1> & 2 2> & 3」命令的用途
#!/bin/bash
#it's normal case fd environment
echo test 1> afile.txt
echo "Test no 1"
cat afile.txt
echo "Test no 1"
echo test 2> afile.txt
echo "Test no 2"
cat afile.txt
echo "Test no 2"
echo test 1> afile.txt
echo "Test no 3"
cat afile.txt
echo "Test no 3"
echo test 2> afile.txt
echo "Test no 4"
cat afile.txt
echo "Test no 4"
echo > afile.txt
echo "------------------------------------------------------------------------"
#it's relocate filedescriptor and cause not problem, and cause error(std error)
var=
var=$(echo test 3>&1 1>&2 2>&3)
echo "Test no 5"
#cat afile.txt
echo $var
echo "Test no 5"
var=
var=$(echo test 3>&1 1>&2 2>&3)
echo "Test no 6"
#cat afile.txt
echo $var
echo "Test no 6"
var=
var=$(echo test 3>&1 1>&2 2>&3)
echo "Test no 7"
#cat afile.txt
echo $var
echo "Test no 7"
var=
var=$(echo test 3>&1 1>&2 2>&3)
echo "Test no 8"
#cat afile.txt
echo $var
echo "Test no 8"
當您執行此範例時,您將看到檔案描述符被重新排列並且輸出發生變化。