HERE 파일을 사용하고 명령의 출력을 리디렉션


11

배치 스크립트에 다음 코드가 있습니다.

mpirun -np 6 ./laplace <<END
100
100
100
0.01
100
3
2
1
END
| tail -n 1 > output

그러나 작동하지 않습니다. 내가하고 싶은 일은 HERE 파일을 mpirun 명령의 입력으로 사용하고 출력을 tail 명령으로 파이프하는 것입니다. 그러나 HERE 파일과 꼬리 출력이 혼란 스럽다고 생각합니다.

내가 원하는 것을하기 위해 이것을 어떻게 써야합니까?

답변:


12

첫 번째 줄에 작성한 내용은 완전한 명령 (쉘 용어의 "(복합) 목록")처럼 보이므로 쉘은이를 완전한 명령으로 취급합니다. 여기 문서 시작 마커 ( <<END)가 있으므로 쉘은 여기 문서 내용을 읽고 새 명령을 시작합니다. here 문서를 목록 중간에 넣으려면 목록이 완료되지 않았 음을 쉘에 표시해야합니다. 몇 가지 방법이 있습니다.

mpirun -np 6 ./laplace <<END |

END
tail -n 1 > output
{ mpirun -np 6 ./laplace <<END

END
} | tail -n 1 > output

또는 명령이 첫 번째 줄에 완전히 맞는지 확인할 수 있습니다.

mpirun -np 6 ./laplace <<END | tail -n 1 > output

END

기억해야 할 규칙은 여기에 문서 내용이 <<END표시기 뒤 인용되지 않은 첫 줄 바꿈 이후에 시작된다는 것 입니다. 예를 들어,이 스크립트를 작성하는 또 다른 혼란스러운 방법이 있습니다.

mpirun -np 6 ./laplace <<END \
| tail -n $(

END
             echo 1) > output

마지막 하나! "난독 화" .. 농담이 아니에요! :) .. 나는 어려운 줄거리 아이디어를 우연히 발견했지만 실제로는 끔찍한 블록과 같은 블록을 이등분하는 것입니다. 이것은 의도적으로 설계된 것일까 요, 우연한 쇠퇴입니까?. (예 : 이것에 대한 실제 사용이 있습니까? ... 그리고 실제로 첫 번째 "소프트"라인에 여러 개의 세미콜론으로 구분 된 명령을 넣을 수도 있습니다.
Peter.O

@fred : 우연한 수차. heredoc이 시작되고 중지되는 위치에 대한 규칙이 있어야합니다. 여기서 규칙은 heredoc은 <<END비트 이후 다음 줄 바꿈 토큰에 연결된 단일 토큰과 같습니다 . 백 슬래시-개행은 개행을 무효화합니다.
Gilles 'SO- 악마 중지'

7
mpirun -np 6 ./laplace <<END | tail -n 1 > output
100
100
100
0.01
100
3
2
1
END
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.