sed 명령어의 매개변수 확장에 대한 내용을 공부하고 정리합니다.
개발서버에 mysql 설치하는 과정을 진행하다가 일부 코드를 해석하는 중에
sed 명령어 매개변수확장
이라는 개념에 대해 알게 되었습니다.
일부 코드 해석
# 스크립트 일부
# base_dir 경로 정의
base_dir="/home/ubuntu/db"
# /home/ubuntu/db/mysql/support-files/mysql.server 파일의 디렉토리 경로 지정
# 모든 행의 basedir=로 시작하는 문자열을 basedir=/home/ubuntu/db/mysql 로 치환
# 모든 행의 datadir=로 시작하는 문자열을 datadir=/home/ubuntu/db/mysql/data 로 치환
# basedir, datadir 경로가 비워져 있다면 /home/ubuntu/db/mysql 만 쓰여짐
cd $base_dir/mysql/support-files
sed -i "s/^basedir=/basedir=${base_dir//\//\\/}\/mysql/g" mysql.server
sed -i "s/^datadir=/datadir=${base_dir//\//\\/}\/mysql\/data/g" mysql.server
# /home/ubuntu/db/mysql 이 원래 basedir 에 있던 경로 앞쪽으로 붙여짐
cd bin
./mysqld --defaults-file=$base_dir/mysql/my.cnf --initialize-insecure --user=ubuntu 2> $base_dir/mysql/mysqld.log
cd support-files/
./mysql.server start
sed -i "s/원래단어/바꿀단어/g"
이런식으로 사용되는 거라고 알고 있었습니다.
따라서 basedir=
의 내용을 /home/ubuntu/db~
로 변경한다는 것을 예상했습니다.
초기 mysql 압축파일 다운받고 mysql.server 를 확인하면
base_dir=
data_dir=
이렇게 비어있기 때문에, /home/ubuntu/db~
경로가 지정됩니다.
하지만 한가지 궁금했던 것이 있었는데,,
저는 변수를 사용해서 경로를 지정할 때에
sed -i "s/^basedir=/basedir=${base_dir}\/mysql/g" mysql.server
이렇게 사용한다고 생각했습니다. 따라서
${base_dir//\//\\/}
이 부분이 이해가 가지 않았고, 실제로 로컬에서 test 해본 결과 위의 코드로 실행하면 아무것도 바뀌지 않는 것을 확인했습니다.
그렇다면${base_dir//\//\\/}
이렇게 사용하는 것이 맞다는 것인데, 혹시 변수를 사용할때에는//\//\\/
를 무조건 써줘야하는 형식인지도 생각해보았습니다. 전임님께 여쭤보고 해답을 알 수 있었습니다!!
우리는 base_dir=${base_dir}
라는 형식이 맞다고 생각할 수 있습니다!
하지만 이 값 자체가 sed라는 명령어를 한번 더 거치기 때문에 /
앞에 백슬래시를 넣어줘서 \/home\/ubuntu\/db
이러한 형태를 만들어주어야 합니다. 이 형태를 만들기 위해서 매개변수 확장 이라는 기능을 이용해서 치환을 시켜줍니다.
여기서 나온 매개변수 확장 이라는 개념에 대해서 정리해보고자 합니다!
해당 document를 보면 더 좋습니다~! 하지만 찾아보니 document에 있는 내용을 정리해둔 블로그가 존재
# base_dir 경로 정의
base_dir="/home/ubuntu/db"
# 경로 변경
cd $base_dir/mysql/support-files
sed -i "s/^basedir=/basedir=${base_dir//\//\\/}\/mysql/g" mysql.server
sed -i "s/^datadir=/datadir=${base_dir//\//\\/}\/mysql\/data/g" mysql.server
${name//찾는단어/변경단어} : 찾는단어와 일치하는 모든 단어를 변경단어로 변경
${base_dir//\//\\/}
: /
를 \/
로 변경\/home\/ubuntu\/db
이런 형태가 되기 때문입니다!참고링크