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

익명 사용자의 이미지

생명과학연구하는 사람입니다.

방대한 양의 데이터를 분석하기 위한 데이터 전처리 과정을 수행할 수 있는 파이프라인으로 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가 끝날때까지 기다렸다가 두번째 값들을 넘겨줘서 두번째 실행이 들어갔으면 합니다.

어떻게 이렇게 구현 가능한지 궁금합니다.

미리 감사합니다.

익명 사용자의 이미지

무슨 말인지 이해를 못하겠네요.

익명 사용자의 이미지

님께서 말씀하신 게
파일1 처리 후 파일2에 저장
파일2 처리 후 파일3에 저장
파일3 처리 후 grep
이거든요. 단계적으로 순차적으로 처리되는 건데,

> 한가지 방법으로, process.sh 파일 내에서 script의 내용을 들여쓰기 하고 최상위에 루프로 각 값을 할당하는 방법이 있겠습니다.
> 외부에서 루프를 통해 filename1, filename2, output_filename에 값을 한번씩 전달하는 방법은 없을까요?

이게 무슨 말인지 이해가 안 되요.

> 그리고 그 루프는 우선 첫번째 process.sh가 끝날때까지 기다렸다가 두번째 값들을 넘겨줘서 두번째 실행이 들어갔으면 합니다.

작성자의 이미지

네 인풋파일 (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
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 에 읽기 권한이 있으니 실행될 거고, 따라서 복사가 될 겁니다.

jick의 이미지

혹 이런 걸 원하시는 건가요.

{ echo "a1-1" ; echo "a1-2"; echo "out1"; } | process.sh
{ echo "a2-1" ; echo "a2-2"; echo "out2"; } | process.sh
...

이렇게 생긴 또다른 파일을 만들고 그 파일을 실행시키면 될 듯합니다만..?

작성자의 이미지

일단 간단한 스크립트 짜서 테스트해봤는데, 저런 식으로 process.sh내의 read로 값 전달이 가능하군요.

요렇게 해보면 원하는 것을 할 수 있을 것 같습니다. 감사합니다.

ymir의 이미지

echo 대신 here document 를 쓸 수도 있습니다.

$ cat process.sh 
#!/bin/bash
 
echo "Input file name 1"
read filename1
echo "Input file name 2"
read filename2
echo "Output filename"
read output_filename
 
echo "program1 $filename1 $filename2 ${output_filename}_after_program1"
echo "program2 ${output_filename}_after_program1 > ${output_filename}_after_program2"
echo "program3 ${ouput_filename}_after_program2 | grep "hello" > ${output_filename}_filtered"
 
exit 0;
 
$ cat input.txt 
a1-1,a1-2,out1
a2-1,a2-2,out2
a3-1,a3-2,out3
a4-1,a4-2,out4
 
$ IFS=,; while read -r input1 input2 output; do bash process.sh << EOF
> $input1
> $input2
> $output
> EOF
> done < input.txt; unset IFS
Input file name 1
Input file name 2
Output filename
program1 a1-1 a1-2 out1_after_program1
program2 out1_after_program1 > out1_after_program2
program3 _after_program2 | grep hello > out1_filtered
Input file name 1
Input file name 2
Output filename
program1 a2-1 a2-2 out2_after_program1
program2 out2_after_program1 > out2_after_program2
program3 _after_program2 | grep hello > out2_filtered
Input file name 1
Input file name 2
Output filename
program1 a3-1 a3-2 out3_after_program1
program2 out3_after_program1 > out3_after_program2
program3 _after_program2 | grep hello > out3_filtered
Input file name 1
Input file name 2
Output filename
program1 a4-1 a4-2 out4_after_program1
program2 out4_after_program1 > out4_after_program2
program3 _after_program2 | grep hello > out4_filtered

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.