리눅스 명령어 sed의 매개 변수 확장이란?

호밀빵 굽는 쿼카·2022년 3월 17일
1

NHN Cloud 인턴

목록 보기
38/48

sed 명령어의 매개변수 확장에 대한 내용을 공부하고 정리합니다.

1. 질문

개발서버에 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//\//\\/} 이렇게 사용하는 것이 맞다는 것인데, 혹시 변수를 사용할때에는 //\//\\/를 무조건 써줘야하는 형식인지도 생각해보았습니다. 전임님께 여쭤보고 해답을 알 수 있었습니다!!


2. 해답

우리는 base_dir=${base_dir}라는 형식이 맞다고 생각할 수 있습니다!
하지만 이 값 자체가 sed라는 명령어를 한번 더 거치기 때문에 / 앞에 백슬래시를 넣어줘서 \/home\/ubuntu\/db 이러한 형태를 만들어주어야 합니다. 이 형태를 만들기 위해서 매개변수 확장 이라는 기능을 이용해서 치환을 시켜줍니다.

여기서 나온 매개변수 확장 이라는 개념에 대해서 정리해보고자 합니다!


3. 매개변수 확장 개념

해당 document를 보면 더 좋습니다~! 하지만 찾아보니 document에 있는 내용을 정리해둔 블로그가 존재

4. 정리

# 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 이런 형태가 되기 때문입니다!

참고링크

profile
열심히 굽고 있어요🍞

0개의 댓글