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


11

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

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

답변:


11

여기서의 문제는 Linux 리디렉션과 관련된 문제가 아닙니다. 오히려 파이프 라인의 작동 방식에 대한 근본적인 오해입니다. 때문에 여기에 리디렉션이 작동하지 않습니다 만 컷이 실제로 표준 출력에 인쇄됩니다. echo 명령에 대한 stdout은 cut의 stdin (파일이 지정되었으므로이 경우에는 사용되지 않음)으로 파이프되었습니다.

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

당신이 원하는, 그리고 전혀 우아하지 것입니다 (나는 대체 당신 ;과 &&이렇게 헤더가 성공적으로 작성된 경우 절단 명령은 실행 것, 그것은 실행되지 않습니다이 방법을 사용하면 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의 일반적인 단축키입니다)

그러나 이것은 stdin에서 절단 작업을 수행합니다 ( "header"의 헤더 행에 나타남). 이것이 당신이 질문에서 원하는 것인지 아닌지를 말하기는 어렵습니다.


13

당신이 찾는 것은 :

{ echo "header line"; cut -c 1-5 input_file; } > output_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

+1 : 더 명확하고 명확하게 어디로 리디렉션되는지 식별합니다. 모든 오류를 리디렉션하려면 (오류 msg 포함) : { .... } > some_file 2>&1( "clobber"some_file.을 clobber하지 않고 대신 추가하려면 다음 >으로 변경하십시오 >>. { ... } >> some_file 2>&1)
— Olivier Dulac

4

exec가 있습니다.

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

+1 : 스크립트에서 이것을 사용하는 것이 매우 일반적입니다 (명령 행에서 덜 혼란스러워지기 시작합니다 ^^)
— Olivier Dulac

누군가이 솔루션을 정교하게 만들 수 있습니까? 나는 그것이 무엇을하고 있는지 알 수 있지만이 맥락에서 '실행'을 이해하지 못합니다. 또한 스크립트의 나머지 부분에 표준 stdout이 필요한 경우 다시 꺼야하는 것으로 보입니다.
— Joe

1
명령없이 스크립트에서 exec를 사용하면 exec에서 I / O 리디렉션을 수행하여 현재 셸 및 이후의 모든 하위 항목에 영향을 줄 수 있습니다.
— 8

감사. 나는 전에 그것을 본 적이 없다. 나는 그것이 매우 유용 할 것이라고 생각합니다.
— Joe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.