터미널 출력 내용을 사용하여 파일 이름 지정

터미널 출력 내용을 사용하여 파일 이름 지정

이 스레드여기터미널 내용을 파일로 출력하는 방법에 대해 논의했습니다. 특히 이것으로:

command |& tee output.txt

질문: 출력 내용의 일부를 활용하여 파일 이름을 지정하는 것이 가능합니까? 예를 들어, 내용이 다음과 같이 한 줄씩 인쇄된다고 가정합니다.

action_1_last_time_2021_06_15_21_34_56
action_2_last_time_2021_06_15_21_35_23
action_3_last_time_2021_06_15_21_43_45
...
action_320032_last_time_2021_06_15_23_59_14

out.txt명령줄 대신 마지막 줄의 내용을 사용하여 파일 이름을 지정할 수 있습니까 ? 일종의 변수겠죠? 여기서 마지막 줄은 파일이 닫히기 직전(그리고 명령 실행이 끝나기 직전)에 나타나는 줄로 정의된 것으로 추정된다.

답변1

그러나 이 문제를 해결하려면 마지막 줄을 읽을 수 있을 때까지 명령 출력을 버퍼링하여 어디에 써야 할지 알아야 합니다.

내가 생각할 수 있는 유일한 합리적인 방법은 임시 파일을 사용한 다음 이름을 바꾸는 것입니다.

tmpfile=$(mktemp)
outfile=$(command | tee "$tmpfile" | tail -n 1)
mv "$tmpfile" "$outfile"

stdout과 stderr을 모두 캡처하려면 |다음으로 변경할 수 있습니다 . 하지만 이 점에 유의하세요.|&5월오류 메시지 다음에 출력 파일의 이름을 지정하게 됩니다(기발한 파일 설명자 fu를 사용하여 이를 피할 수 있는 방법이 있을 수도 있지만).

sponge( package 에서) 명령 을 사용하여 대체 솔루션을 구현하는 것이 가능할 수 있지만 moreutils내부적으로는 동일한 기술을 사용할 가능성이 높습니다. 실제로 매뉴얼 페이지에는 다음과 같이 나와 있습니다.

   When possible, sponge creates or updates the output file atomically by
   renaming a temp file into place.

또 다른 옵션은 rev마지막 줄을 먼저 읽을 수 있도록 줄을 뒤집은 다음 다시 rev출력 순서를 복원하는 것입니다. 그러나 여기에는 전체 출력을 버퍼링하는 작업이 포함됩니다.두 배.

관련 정보