「3>&1 1>&2 2>&3」在腳本中扮演什麼角色?

「3>&1 1>&2 2>&3」在腳本中扮演什麼角色?

我在腳本中看到了這一行:

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命令列中的 將會建立一個新的檔案描述符並將其重定向1STDOUT.現在1>&2將檔案描述符 1 重定向到STDERR並將2>&3檔案描述符 2 重定向到 3,即STDOUT.

所以基本上你切換了STDOUTSTDERR,這些是步驟:

  1. 建立一個新的fd 3並將其指向fd 1
  2. 將檔案描述符 1 重定向到檔案描述符 2。
  3. 將檔案描述符 2 重新導向到檔案描述符 3。

現在,如果程式將某些內容列印到文件描述符 1,它將列印到文件描述符 2,反之亦然。

答案2

它正在交換stdoutstderr

>name表示將輸出重定向到檔案name

>&number意味著將輸出重定向到檔案描述符number

因此&需要告訴 shell 您指的是檔案描述符,而不是檔案名稱。

文件描述符是指一個已經開啟的檔案的數字。標準0用於標準輸入、1標準輸出或2標準誤差。您也可以使用任何其他數字,這將建立一個新的檔案描述符,就像您使用 . 建立新變數一樣var=value

預設情況下,檔案描述符12go 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"

當您執行此範例時,您將看到檔案描述符被重新排列並且輸出發生變化。

相關內容