웬만하면 파이썬 스크립트 내에서 반복적인 작업들을 해결할 수 있지만

 

가끔 어떤 main.py 파일을 한두개의 argument만 조금 바꿔서 반복적으로 실행해야 하는 경우가 있다.

 

예를 들자면 요즘 arbitrary-scale SR 실험을 이것 저것 해보고 있는데,

 

x1.1~x4.0까지의 결과를 만들고 각 scale에서의 PSNR을 측정하는 작업을 일일히 하기에는 너무 번거로운 일이다.

 

 

bash의 함수 정의와 export 구문을 사용하면 아래와 같은 조악한 pseudo-code가 나온다.

#!/bin/bash

do_something () {
    python task_1.py --var1 ${VAR1} --shared1 SHARED1
    python task_2.py --var2 ${VAR2} --shared2 SHARED2
}

export VAR1="abc"
export VAR2="def"
do_something

export VAR1="ghi"
export VAR2="jkl"
do_something

SHARED1과 SHARED2는 고정된 argument이고, 같은 스크립트(들)을 --var1과 --var2를 바꿔가며 돌릴 수 있다.

 

다만 몇 가지 문제가 있는데,

  • export 구문으로 정의한 값이 system에 미리 할당이 되어 있던 경우 참사가 발생할 수 있음.
  • 하나의 do_something을 실행하는데에 3줄이나 필요해서 깔끔하지 않음.

정도가 내가 신경쓰였던 것이다.

 

 

아래와 같이 바꾸면 이런 문제를 해결할 수 있다.

#!/bin/bash

do_something () {
    python task_1.py --var1 $1 --shared1 SHARED1
    python task_2.py --var2 $2 --shared2 SHARED2
}

do_something "abc" "def"
do_something "ghi" "jkl"

신기하게도 bash function은 정의할 때 argument를 몇 개 받는지 명시해놓지 않는다.

 

$1과 $2는 각각 함수 호출시에 넣어준 argument들을 말한다.

 

 

여기서 조금 주의해야 할 것은 bash 스크립트 호출 당시에 사용한 argument 또한 $1, $2, ... 등으로 사용하는데

 

함수의 scope 내에서는 이 값들이 함수의 argument로 덮어씌워진다.

 

아래 예시를 보면 쉽게 알 수 있다.

#!/bin/bash

do_something () {
    echo $1
    echo $2
}

echo $1
do_something "123" "456"

위와 같은 example.sh 파일을 만들고 실행하면 다음과 같은 결과가 나온다.

$ bash example.sh "hi"
hi
123
456

script 실행시에 제공한 argument를 함수 내에서 사용하려면

 

export 구문을 조심스럽게 사용하거나, 아니면 함수의 argument로 $1, $2, ... 등을 넣어주면 될 것 같다.

+ Recent posts