bash - export用法 - shell script



在這個bash命令1>&2中,&符號表示什麼 (4)

&符號屬於“1”,所以片段實際上有三個部分:“2”,“>”,“&1”。 它們分別表示“從輸出流2中獲取數據(這是標準錯誤)”,“重定向它”,以及重定向目標,即輸出流1.因此,“&”在此處允許您重定向到現有流而不是文件。

快速的一個, 2>&1將stderr重定向到stdout,但是&符號是什麼意思? 我知道如果我們有2 > 1它會輸出到一個名為1的文件,那麼&符號會做什麼?


Answer #1

& in &1複製文件描述符1 。 重複的描述符實際上不像副本,但像舊的別名一樣。 複製1允許將多個流重定向到1而不會相互覆蓋。

示例:(no &

$ ls existing-file non-existent-file > tmp 2> tmp 
$ cat tmp
existing-file
nt-file: No such file or directory

注意1覆蓋了2寫的內容。 但是當我們使用&時不是:

$ ls existing-file non-existent-file > tmp 2>&1 
$ cat tmp
ls: non-existent-file: No such file or directory
existing-file

文件描述符是文件(或其他輸入/輸出資源,例如管道或網絡套接字)的句柄。 當12分別重定向到tmp (如第一個示例中所示),它們獨立地移動它們的tmp文件指針。 這就是文件描述符相互覆蓋的原因。

根據Linux手冊頁

[重複文件描述符]指的是相同的打開文件描述,因此共享文件偏移和文件狀態標誌; 例如,如果通過在其中一個描述符上使用lseek(2)修改文件偏移量,則另一個描述符的偏移量也會更改。

請注意,即使&作為別名, 2>&1表示將2重定向到當前指向的1的流。 當1被重定向到其他東西時, 2指向同一個文件,它獨立於1

注意:

$ ls existing-file non-existent-file > tmp 2>&1 > tmp1
$ cat tmp1
existing-file
$ cat tmp
ls: non-existent-file: No such file or directory

Answer #2

&符號不做任何事情 - 它是2>&1運算符中的字符,而不是它本身就是一個東西。

bash支持多個重定向運算符2>&1運算符或&>運算符將重定向之前或之後的進程流綁定在一起。


Answer #3

來自info bash

3.6.7 Duplicating File Descriptors
----------------------------------

The redirection operator
     [N]<&WORD
   is used to duplicate input file descriptors.  If WORD expands to one
or more digits, the file descriptor denoted by N is made to be a copy
of that file descriptor.  If the digits in WORD do not specify a file
descriptor open for input, a redirection error occurs.  If WORD
evaluates to `-', file descriptor N is closed.  If N is not specified,
the standard input (file descriptor 0) is used.

   The operator
     [N]>&WORD
   is used similarly to duplicate output file descriptors.  If N is not
specified, the standard output (file descriptor 1) is used.  If the
digits in WORD do not specify a file descriptor open for output, a
redirection error occurs.  As a special case, if N is omitted, and WORD
does not expand to one or more digits, the standard output and standard
error are redirected as described previously.

所以2>&1將fd 1複製到fd 2上。





scripting