모든 기준을 스크립트의 나머지 부분으로 리디렉션

모든 기준을 스크립트의 나머지 부분으로 리디렉션

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)은 catfd 3이 사용되지 않기 때문에 필요하지 않지만 일반적으로 좋은 습관이며 엄밀히 말하면 쉘 O_CLOEXEC 동작을 에뮬레이트하기 위해 모든 명령에 추가해야 합니다).

관련 정보