웬만하면 파이썬 스크립트 내에서 반복적인 작업들을 해결할 수 있지만
가끔 어떤 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, ... 등을 넣어주면 될 것 같다.
'잡기술 > Ubuntu' 카테고리의 다른 글
티먹스 tmux 사용해서 터미널 여러 개 띄우기 (2) - 스크롤, .tmux.conf (0) | 2021.04.28 |
---|---|
티먹스 tmux 사용해서 터미널 여러 개 띄우기 (1) (0) | 2021.04.26 |
우분투 파일에서 특정 단어 찾기 - grep (0) | 2021.04.24 |
우분투 터미널 출력 로그 파일로 저장하기 - tee (0) | 2021.04.24 |
매트랩 MATLAB 코드와 함수 터미널에서 실행하기 (0) | 2021.04.23 |