마지막 명령뿐만 아니라 모든 명령의 출력을 파일로 리디렉션

마지막 명령뿐만 아니라 모든 명령의 출력을 파일로 리디렉션

echo를 사용하여 파일에 헤더를 추가한 다음 명령을 사용하여 파일의 나머지 부분을 만들고 싶습니다. 이는 두 개의 별도 명령을 사용한다는 의미입니다.

리디렉션을 통해 두 명령의 출력을 파일에 어떻게 쓸 수 있습니까?

나는 노력했다

echo "header line" | cut -c 1-5 input_file > output_file

echo "header line"; cut -c 1-5 input_file > output_file

이는 cut 명령의 출력만 리디렉션합니다.

다음 명령은 작동하지만 투박한 느낌이 듭니다.

echo "header line" > output_file; cut -c 1-5 input_file >> output_file

내 문제를 해결하는 현명한 방법은 무엇입니까?

답변1

당신이 찾고 있는 것:

{ echo "header line"; cut -c 1-5 input_file; } > output_file
  • 이 구문은 명령이 하위 쉘이 아닌 현재 쉘에서 실행되므로 부작용이 없습니다.
  • 출력 파일에 들어가는 명령은 명확하게 구분됩니다.
  • 확장성이 매우 뛰어나므로 다음과 같이 다시 작성할 수 있습니다.

{
  echo "header line"
  cut -c 1-5 input_file
  ... # insert new commands here
} > output_file

오류를 동일한 파일에 출력하려면 다음과 같이 마지막 줄을 수정하면 됩니다.

} > output_file 2>&1

이 팁을 제공한 Olivier Dulac에게 감사드립니다.

블록 내의 일부 출력을 화면에 표시하려면 다음 구문을 사용할 수 있습니다.

{
  echo "header line"
  echo "this line doesn't go to output_file" > /dev/tty
  cut -c 1-5 input_file
} > output_file

답변2

여기서 문제는 Linux 리디렉션 문제가 아닙니다. 오히려 배관이 어떻게 작동하는지에 대한 근본적인 오해입니다. 여기서 리디렉션이 작동하지 않는 이유는 다음과 같습니다.오직cut은 실제로 표준 출력으로 인쇄됩니다. echo 명령의 표준 출력은 cut의 표준 입력(파일이 지정되었기 때문에 이 예제에서는 사용되지 않음)으로 파이프됩니다.

echo "header line" > output_file && cut -c 1-5 input_file >> output_file

;당신이 원하는 것, 전혀 우아하지 않습니다. (헤더가 성공적으로 작성된 경우 에만 cut 명령이 실행되도록 당신의 것을 당신의 것으로 바꿨습니다 &&. 이렇게 하면, 당신이 output_file을 만들거나 쓸 수 있는 권한이 없다면, 실행하지 않음).

또한 이 모든 작업을 서브셸에서 수행할 수도 있습니다.

(echo "header line"; cut -c 1-5 input_file) > output_file

그러나 이렇게 하면 실질적인 이점이 없으며 더 복잡한 예의 경우 하위 쉘 범위 지정에 익숙하지 않으면 문제가 발생할 수 있습니다.

stdin을 stdout으로 전달하려면 다음을 시도해 보십시오.

echo "header line" | cut -c 1-5 - input_file

(대시(-)는 표준 입력의 일반적인 단축키입니다.)

그러나 이는 stdin에서도 잘라내기를 수행합니다(결과적으로 헤더 줄 "header"가 생성됨). 이것이 당신이 원하는 것인지 여부를 질문에서 말하기는 어렵습니다.

답변3

답변을 완성하기 위해 exec가 있습니다.

exec > output_file
echo "header line"
cut -c 1-5 input_file

관련 정보