스크립트에서 다음 줄을 봤습니다.
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이라는 것을 알고 있지만 the 3
와 the는 무엇을 &
위한 것인가요?
답변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
출력을 file 로 리디렉션하는 것을 의미합니다 name
.
>&number
출력을 파일 설명자로 리디렉션하는 것을 의미합니다 number
.
따라서 &
파일 이름이 아닌 파일 설명자를 의미한다는 것을 쉘에 알리는 데 필요합니다.
파일 설명자는 이미 열려 있는 파일을 참조하는 번호입니다. 표준은 0
표준 입력, 1
표준 출력 또는 2
표준 오류에 대한 것입니다. 를 사용하여 새 변수를 만들 때와 마찬가지로 새 파일 설명자를 만드는 다른 숫자를 사용할 수도 있습니다 var=value
.
기본적으로 파일 설명자 1
와 2
로 이동하므로 새 셸에서 /dev/tty
실행해도 somecommand 3>&1 1>&2 2>&3
아무 것도 변경되지 않습니다(이제 파일 설명자 번호가 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"
이 예제를 실행하면 파일 설명자가 다시 정렬되고 출력이 변경되는 것을 볼 수 있습니다.