Bash eval - 동적 명령어 실행
eval이란?
eval 명령어는 문자열 인수를 받아서 명령어로 실행합니다. 명령어를 실행하기 전에 문자열 수준에서 조작해야 할 때 매우 유용합니다.
동적으로 명령어를 만들고 실행하는 것이라고 생각하면 됩니다!
기본 사용법
# 간단한 예제
command="ls -la"
eval $command
# ls -la를 실행하는 것과 동일
실용적인 예제
1. 동적 변수 이름
# 동적으로 변수 생성
for i in {1..3}; do
eval "var$i=value$i"
done
# 이제 var1=value1, var2=value2, var3=value3이 생성됨
# 동적으로 접근하기
for i in {1..3}; do
eval "echo \$var$i"
done
2. 복잡한 명령어 구성
# 명령어 문자열 구성
search_term="*.txt"
options="-name"
action="-exec cat {} \;"
find_command="find . $options '$search_term' $action"
eval $find_command
3. 설정 처리
# 설정 같은 문자열 처리
config="USER=john PASSWORD=secret123 HOST=localhost"
eval $config
echo "$USER로 $HOST에 연결 중"
eval을 사용해야 할 때
✅ 좋은 사용 사례:
- 동적 변수 생성
- 사용자 입력으로부터 명령어 구성 (적절한 검증 필수!)
- 설정 문자열 처리
- 셸 스크립트에서의 메타프로그래밍
❌ 피해야 할 경우:
- 배열이나 다른 안전한 대안을 사용할 수 있을 때
- 검증 없이 신뢰할 수 없는 입력을 처리할 때
- 단순한 변수 할당 (직접 할당 사용)
보안 경고
⚠️ 주의하세요! eval은 주어진 것을 무엇이든 실행하므로 위험할 수 있습니다:
# 위험 - 사용자 입력으로 절대 이렇게 하지 마세요
user_input="rm -rf /"
eval $user_input # 모든 것을 삭제할 수 있습니다!
eval을 사용하기 전에 항상 입력을 검증하고 소독하세요!
더 안전한 대안
때로는 eval이 필요 없습니다:
# 간단한 경우 eval 대신
# 나쁨:
eval "ls $options"
# 좋음:
ls $options
# 배열 사용:
# 동적 변수 대신 배열 사용
declare -a values=("value1" "value2" "value3")
프로 팁
- 적절한 따옴표 사용: 단어 분리를 방지하기 위해 항상 변수를 따옴표로 감싸기
- 입력 검증: 신뢰할 수 없는 데이터를 절대 eval하지 않기
- 대안 고려: 배열, 매개변수 확장 등
- 먼저 디버그: 실행하기 전에 명령어를 echo로 확인
# 디버그 패턴
command="ls -la /tmp"
echo "실행할 명령어: $command"
eval $command
참고자료
eval을 현명하게 사용하세요 - 큰 힘에는 큰 책임이 따릅니다! 🚀