bash 스크립트가 있고 나머지 모든 출력을 파일로 리디렉션하고 싶습니다.
#!/bin/bash
# the part I don't know ${file}
echo spo
echo car
cat ${file}
출력은 spocar\n여야 합니다.\n
답변1
스크립트의 나머지 부분에 대해 stdout을 리디렉션하는 경우 "cat" 명령이 포함되므로 출력이 표시되지 않으며 $file
자체 재귀 복사본이 무한정 채워질 수 있습니다(너무 작지 않은 경우에도) cat
. 쓰기 시작하기 전에 마지막에).
이제부터 표준 출력을 리디렉션하려면 다음을 수행하면 됩니다.
exec > "$file"
하지만 여기서는 다음을 원할 수도 있습니다.
#! /bin/bash -
{
echo spo
echo car
} > "$file"
cat < "$file"
다음을 수행할 수도 있습니다.
exec 3>&1 # save stdout as fd 3
exec > "$file"
echo spo
echo car
exec >&3 3>&- # restore stdout and close fd 3
cat < "$file"
(그런데 위의 내용은 복합 명령을 리디렉션할 때 현대 쉘이 내부적으로 수행하는 작업입니다 { some; code; } > ...
(비록 10보다 큰 fd를 사용하고 실행 명령이 표시되지 않도록 O_CLOEXEC 플래그를 설정하지만). 여기서 Bourne은 쉘은 서브쉘을 포크합니다)
또한 위의 코드에서는가지다스크립트의 나머지 부분에 대한 표준 출력을 복원하려면 cat
다음 명령에 대해서만 이 작업을 수행할 수 있습니다.
cat < "$file" >&3 3>&-
( 3>&-
(close fd 3)은 cat
fd 3이 사용되지 않기 때문에 필요하지 않지만 일반적으로 좋은 습관이며 엄밀히 말하면 쉘 O_CLOEXEC 동작을 에뮬레이트하기 위해 모든 명령에 추가해야 합니다).