"sh a.sh <&0 >&0"은(는) 무슨 뜻인가요?

"sh a.sh <&0 >&0"은(는) 무슨 뜻인가요?

sh a.sh <&0 >&0- 무슨 뜻이에요? 특히나 그게 무슨 뜻인지 잘 모르거든요 &0.

답변1

n>&p및 파일 설명자(fd)를 파일 설명자에 n<&p복사하는 데 사용되는 것과 동일한 연산자입니다 . 즉, 파일 설명자를 fd가 리디렉션하는 리소스 로 리디렉션합니다.pnnp

리디렉션된 파일 설명자가 사용되는 방향(읽기 또는 쓰기)을 결정하는 데 사용 <되지 않습니다 . 와 같은 방향을 얻게 됩니다 . 즉, 쓰기용으로 열려 있으면 이 연산자를 사용하는 경우에도 마찬가지입니다.>nppnn<&p

두 연산자의 유일한 차이점은 n지정되지 않은 경우입니다. >&pstdout을 리디렉션하고( 1>&p또는 와 유사 1<&p) <&pstdin을 리디렉션합니다( 또는 와 유사 0<&p) 0>&p.

<&0마찬가지로 0<&0stdin을 리디렉션되는 리소스로 stdin을 리디렉션하므로 유용한 것이 없으며 일반적으로 작동하지 않으며 별 의미가 없습니다.

그러나 모든 쉘에서 항상 작동하지 않는 것은 아닙니다. 작업 제어가 비활성화되면 POSIX에서는 백그라운드 명령의 stdin을 /dev/null해당 파일이나 동등한 파일로 리디렉션해야 합니다. <&0이는 Bash에서 재정의됩니다 (4.4.12에서 테스트됨) . 비교 (ls -l /proc/self/fd/0 &)하고 (<&0 ls -l /proc/self/fd/0 &). 이는 일부 상황에서 유용합니다.

>&0fd 0을 fd 1에 복사합니다. fd 1(stdout)은 관례적으로 쓰기에만 사용되므로 >&0fd 0이 읽기+쓰기 모드로 열리는 경우에만 의미가 있습니다.

이는 fd 0이 터미널 장치를 가리킬 때 발생합니다. 터미널 에뮬레이터는 getty일반적으로 터미널 장치를 읽기+쓰기 모드로 열고 fd 0, 1, 2를 여기에 할당하기 때문입니다.

따라서 이 글을 쓴 사람은 stdin이 터미널을 가리킨다고 가정하고 stdout을 터미널로 리디렉션하고 싶었을 것입니다.

의미가 있는 곳 중 하나 n>&n는 zsh와 그 mult_IOs기능입니다. 존재하다 zsh:

some-cmd >&1 > some-file
# that is: some-cmd 1>&1 1> some-file

다음과 같이 표준 출력을 some-cmd(&1) 및 그 이전의 모든 stdout으로 리디렉션합니다.some-file

some-cmd | tee some-file

하지만

some-cmd <&0 < some-file
# that is: some-cmd 0<&0 0< some-file

다음과 같이 원시 표준 입력을 먼저 제공한 다음 some-file입력으로 제공합니다.some-cmd

cat - some-file | some-cmd

그러나 cmd <&0 >&0fd 0에서는 한 번만 리디렉션되므로 적용되지 않습니다.

n>&nksh또한 일부 셸( , zsh, not dash또는 )에서는 파일 설명자가 열려 있지 않으면 오류를 유발하고 명령 실행을 중단할 수 있다는 점에서 bash흥미로운 부작용이 있을 수 있습니다 . 그래서 그 껍질 안에는yashn

cmd 0<&0

cmd종료 병리학적 조건 에서 실행을 방지합니다 stdin.

$ ksh -c 'cat file - <&0' <&-
ksh: 0: cannot open [Bad file descriptor]
$ mksh -c 'cat file - <&0' <&-
mksh: <&0 : bad file descriptor
$ zsh -c 'cat file - <&0' <&-
zsh:1: 0: bad file descriptor

$ bash -c 'cat file - <&0' <&-
contents of file
cat: -: Bad file descriptor
cat: closing standard input: Bad file descriptor

답변2

이 경우 & 뒤에 숫자가 붙으면 파일 번호를 나타냅니다. 파일 번호 0은 표준 입력( stdin)입니다. <및 문자는 >각각 프로세스의 표준 입력 및 표준 출력의 리디렉션을 나타냅니다.

따라서 간단히 말해서 이 명령은 실행 a.sh( sh쉘 스크립트로)하여 스크립트의 표준 입력 및 출력(실제로는 하위 쉘)을 표준 입력으로 리디렉션하는 것을 의미합니다.

이 경우 <&0중복됩니다(기본 동작). >&0이는 상위 쉘을 기준으로 표준 출력에 인쇄되는 내용을 표준 입력으로 인쇄한다는 의미입니다. 대부분의 tty는 이러한 출력을 표시하므로 리디렉션은 효과가 거의 없으며 눈에 띄는 효과가 없을 수도 있습니다.

가능한 시나리오 중 하나는 상위 셸의 표준 출력 파일이 이상하게 닫혀 있다는 것입니다. 이것은 이상한 경우입니다.

관련 정보