스크립트에서 "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이라는 것을 알고 있지만 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한 단계는 다음과 같습니다.

  1. 새로운 fd 3을 생성하고 fd 1을 가리킵니다.
  2. 파일 설명자 1을 파일 설명자 2로 리디렉션합니다. 파일 설명자를 3에 저장하지 않았다면 대상을 잃게 됩니다.
  3. 파일 설명자 2를 파일 설명자 3으로 리디렉션합니다. 이제 파일 설명자 1과 2가 전환됩니다.

이제 프로그램이 파일 설명자 1에 무언가를 인쇄하면 파일 설명자 2에도 인쇄되고 그 반대도 마찬가지입니다.

답변2

교환 stdout하고 stderr.

>name출력을 file 로 리디렉션하는 것을 의미합니다 name.

>&number출력을 파일 설명자로 리디렉션하는 것을 의미합니다 number.

따라서 &파일 이름이 아닌 파일 설명자를 의미한다는 것을 쉘에 알리는 데 필요합니다.

파일 설명자는 이미 열려 있는 파일을 참조하는 번호입니다. 표준은 0표준 입력, 1표준 출력 또는 2표준 오류에 대한 것입니다. 를 사용하여 새 변수를 만들 때와 마찬가지로 새 파일 설명자를 만드는 다른 숫자를 사용할 수도 있습니다 var=value.

기본적으로 파일 설명자 12로 이동하므로 새 셸에서 /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의 출력이 이동하기를 원할 것입니다.stdoutstderr

또한보십시오리디렉션 순서

답변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"

이 예제를 실행하면 파일 설명자가 다시 정렬되고 출력이 변경되는 것을 볼 수 있습니다.

관련 정보