exec {ec}< <(echo "puts 'hello'") && sudo ruby /proc/$$/fd/${ec}
일단 내가 닫으면
exec <&"${ec}"-
쉘이 종료됩니다.
또 다른 경우에는 다음 파일 설명자를 만듭니다.
exec {gr}> >(/usr/bin/grep 'hello')
그런 다음 전원을 끄고 exec >&${gr}-
이제 이와 같은 간단한 명령을 실행하면 ls
아무 것도 인쇄되지 않습니다.
나는 그것을 할 수 ls >&2
있고 확실히 뭔가를 보여 주지만 분명히 stdout은 이제 MIA입니다.
저는 이 모든 파일 설명자 비즈니스가 어떻게 작동하는지 아직도 배우고 있으며 몇 가지 지침을 원합니다. 감사해요.
답변1
값은 다음과 같
>&-
거나<&-
앞에 오는 것입니다.{varname}
변수 이름닫힐 파일 설명자를 정의합니다.
그래서 exec {fd}>&-
(또는 {fd}<&-
) 닫습니다.
$ exec {fd}>foo.out
$ echo "$fd"
10
$ echo hi >&"$fd" # works
$ exec {fd}>&- # close it
$ echo ho >&"$fd" # doesn't work any more
bash: "$fd": Bad file descriptor
$ cat foo.out
hi
exec <&"${ec}"-
이름이 지정된 fd를 $ec
stdin으로 이동합니다(stdin을 fd의 복사본으로 만든 $ec
다음 fd를 닫습니다 $ec
). 이제 쉘은 표준 입력을 프로세스 대체에 연결하고 계속해서 거기에서 입력을 읽습니다. 그러나 ruby
모든 것을 읽었고 파이프가 EOF를 제공하고 쉘을 종료할 가능성이 있습니다.
마찬가지로 stdout을 exec >&${gr}-
(end)에 저장된 fd로 리디렉션합니다. 예를 들어 from의 추가 일반 출력은 프로세스 대체 및 로 이동하므로 눈에 보이는 출력은 생성되지 않습니다.$gr
$gr
ls
grep
ls
echo hello
평소와 같이 숫자가 포함될 수 있으므로 $gr
분사를 피하기 위해 여기에 인용해야 합니다 . IFS
그래서 로 쓰는 것이 가장 좋습니다 exec >&"${gr}"-
.
수정하려는 fd 번호가 리디렉션에서 가장 먼저 나오며, 기본값은 0
의 경우 stdin( ) <
, 의 경우 stdout( 1
) 입니다 >
.