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


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.