배치 스크립트에 다음 코드가 있습니다.
mpirun -np 6 ./laplace <<END
100
100
100
0.01
100
3
2
1
END
| tail -n 1 > output
하지만 작동하지 않습니다. 내가 원하는 것은 HERE 파일을 mpirun 명령의 입력으로 사용한 다음 출력을 tail 명령으로 파이프하는 것입니다. 그러나 HERE 파일과 tail 출력이 엉망인 것 같습니다.
원하는 효과를 얻으려면 어떻게 작성해야 하나요?
답변1
첫 번째 줄에 작성한 내용은 완전한 명령(쉘 용어로 "(복합) 목록")처럼 보이므로 쉘은 이를 완전한 명령으로 처리합니다. 문서 시작 태그( <<END
)가 있기 때문에 쉘은 문서의 내용을 읽은 다음 새 명령을 시작합니다. 이 문서를 목록 중간에 배치하려면 목록이 아직 완료되지 않았음을 쉘에 표시해야 합니다. 이를 수행하는 방법에는 여러 가지가 있습니다.
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
답변2
mpirun -np 6 ./laplace <<END | tail -n 1 > output
100
100
100
0.01
100
3
2
1
END