외부에서 bash script에 인수 전달하기

글쓴이: 익명 사용자 / 작성시간: 금, 2020/01/24 - 10:35오후
생명과학연구하는 사람입니다.
방대한 양의 데이터를 분석하기 위한 데이터 전처리 과정을 수행할 수 있는 파이프라인으로 process.sh 라는 bash script가 있다고 하겠습니다.
echo "Input file name 1" read filename1 echo "Input file name 2" read filename2 echo "Output filename" read output_filename program1 $filename1 $filename2 ${output_filename}_after_program1 program2 ${output_filename}_after_program1 > ${output_filename}_after_program2 program3 ${ouput_filename}_after_program2 | grep "hello" > ${output_filename}_filtered
사실 위 예는 간단히 process.sh의 내용 중 일부분을 보여준 것이고 사실은 훨씬 깁니다.
문제는 filename1, filename2, output_filename이 여러 개가 있어서 한번 입력/실행하고 기다렸다가 다시 입력/실행하고......
이런 식으로 해왔습니다. 참고로 한번 실행시간이 데이터에 따라 짧게는 30분 길게는 4시간 이상 걸립니다.
한가지 방법으로, process.sh 파일 내에서 script의 내용을 들여쓰기 하고 최상위에 루프로 각 값을 할당하는 방법이 있겠습니다.
그런데 혹시 process.sh파일은 건들지 않고
외부에서 루프를 통해 filename1, filename2, output_filename에 값을 한번씩 전달하는 방법은 없을까요?
그리고 그 루프는 우선 첫번째 process.sh가 끝날때까지 기다렸다가 두번째 값들을 넘겨줘서 두번째 실행이 들어갔으면 합니다.
어떻게 이렇게 구현 가능한지 궁금합니다.
미리 감사합니다.
Forums:
무슨 말인지 이해를 못하겠네요.
무슨 말인지 이해를 못하겠네요.
님께서 말씀하신 게
님께서 말씀하신 게
파일1 처리 후 파일2에 저장
파일2 처리 후 파일3에 저장
파일3 처리 후 grep
이거든요. 단계적으로 순차적으로 처리되는 건데,
> 한가지 방법으로, process.sh 파일 내에서 script의 내용을 들여쓰기 하고 최상위에 루프로 각 값을 할당하는 방법이 있겠습니다.
> 외부에서 루프를 통해 filename1, filename2, output_filename에 값을 한번씩 전달하는 방법은 없을까요?
이게 무슨 말인지 이해가 안 되요.
> 그리고 그 루프는 우선 첫번째 process.sh가 끝날때까지 기다렸다가 두번째 값들을 넘겨줘서 두번째 실행이 들어갔으면 합니다.
네 인풋파일 (filename1, filename2
네 인풋파일 (filename1, filename2)과 아웃풋파일내임(output_filename)을 process.sh에 전달하면, 결과적으로 데이터 전처리가 끝나면, ${output_filename}_filtered 라는 파일을 얻게 됩니다.
만약 인풋파일1, 인풋파일2, 아웃풋파일의 조합의 갯수가 많아서
a1-1, a1-2, out1
a2-1, a2-2, out2
a3-1, a3-2, out3
a4-1, a4-2, out4
......
으로 있을 때, process.sh에 우선 a1-1, a1-2, out1 를 전달하여 out1_filtered를 얻고, 이 실행이 끝나면 다시 a2-1, a2-2, out2를 전달하여 out2_filtered를 얻고, 다시 a3-1, a3-3, out3를 전달하여 out3_filtered를 얻고 싶습니다.
> 그리고 그 루프는 우선 첫번째 process.sh가 끝날때까지 기다렸다가 두번째 값들을 넘겨줘서 두번째 실행이 들어갔으면 합니다.
위 말뜻은 out1_filtered를 얻기 전까지는 a2-1, a2-2, out2를 전달하지 않았으면 한다는 뜻으로, 좀더 쉽게 설명을 드리자면 한 번에 한번씩 순차적으로 실행이 되었으면 한다는 뜻입니다.
그러니까...
그러니까...
a1-1, a1-2, out1
a2-1, a2-2, out2
a3-1, a3-2, out3
a4-1, a4-2, out4
이렇게 순차적으로 실행되어야 한다는 말씀이잖아요.
> 위 말뜻은 out1_filtered를 얻기 전까지는 a2-1, a2-2, out2를 전달하지 않았으면 한다는 뜻
전달이 아니겠죠. out1_filtered 를 얻은 후에 a2-1, a2-2, out2 를 실행하라는 의미죠?
a1-1, a1-2, out1
a1-1, a1-2, out1
a2-1, a2-2, out2
a3-1, a3-2, out3
a4-1, a4-2, out4
인과 관계 때문에 병렬처리를 할 수 없으니 이렇게 순차적으로 실행되어야 한다는 가정하에 답변드립니다.
그냥... 알고리즘이... 아래처럼 되잖아요.
i 값이 1 부터 n 까지
process ai-1, ai-2, outi
...
process an-1, an-2, outn
--------
아래 코드는 그냥 예시입니다.
for (i = 1; i < n; i++)
{
/* process ai_1, ai-2, outi */
}
process.sh 를 수정하면 안 된다고 하셨으니,
process.sh 를 복사한 후 수정해서 실행시키세요.
process.sh 에 읽기 권한이 있으니 실행될 거고, 따라서 복사가 될 겁니다.
...
혹 이런 걸 원하시는 건가요.
이렇게 생긴 또다른 파일을 만들고 그 파일을 실행시키면 될 듯합니다만..?
일단 간단한 스크립트 짜서 테스트해봤는데, 저런
일단 간단한 스크립트 짜서 테스트해봤는데, 저런 식으로 process.sh내의 read로 값 전달이 가능하군요.
요렇게 해보면 원하는 것을 할 수 있을 것 같습니다. 감사합니다.
음 ..
echo 대신 here document 를 쓸 수도 있습니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
댓글 달기