스크립트에서 다음 줄을 봤습니다.
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을 알고 있지만 3
and &
의 용도는 무엇입니까?
답변1
이 숫자는 파일 설명자이며 처음 3개(0부터 시작)만 표준화된 의미를 갖습니다.
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로 리디렉션합니다. 3에서 파일 설명자를 저장하지 않으면 대상을 잃게 됩니다.
- 파일 설명자 2를 파일 설명자 3으로 리디렉션합니다. 이제 파일 설명자 1과 파일 설명자 2가 교체되었습니다.
이제 프로그램이 파일 설명자 1에 무언가를 인쇄하면 파일 설명자 2에도 인쇄되고 그 반대의 경우도 마찬가지입니다.
답변2
교환 stdout
하고 있습니다 stderr
.
>name
출력을 파일로 리디렉션합니다 name
.
>&number
출력을 파일 설명자로 리디렉션하는 것을 의미합니다 number
.
따라서 &
파일 이름이 아니라 파일 설명자를 의미한다는 것을 쉘에 알려야 합니다.
파일 설명자는 열린 파일을 참조하는 번호입니다. 표준은 표준 입력, 표준 출력 또는 표준 오류 0
에 사용됩니다 . 를 사용하여 새 변수를 생성하는 것처럼 새 파일 설명자를 생성하는 다른 숫자를 사용할 수도 있습니다 .1
2
var=value
이는 파일 설명자에 해당되며 1
기본적 으로 로 이동하므로 새 셸에서 실행 하면 아무 것도 변경되지 않습니다(현재 파일 설명자 번호는 3입니다).2
/dev/tty
somecommand 3>&1 1>&2 2>&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"
이 예제를 실행하면 파일 설명자가 다시 정렬되고 출력이 변경되는 것을 볼 수 있습니다.