Bash 스크립트 eval, quoting과 command substitution 에 대해서...
bash 스크립트를 짜다가 갑자기 eval, quoting과 command substitution에 대해 좀 명확히 해서 블로그에 올리고 싶어서 실험을 좀 하였다.
위는 weak quoting ("") 과 eval의 기본적인 특성을 보여주는 예시이다.
근데 eval을 통해 $c의 값을 온전히 출력하려면 어떻게 해야할까?
eval "echo \"hello\\\";echo \\\"fool\"" 이 실행되도록 하면 된다.
그러면 결국 echo "hello\";echo \"fool"이 실행되어 hello";echo "fool 이 출력될 것이다.
(물론 eval "echo \$c" 가 제일 쉬운 방법)
위는 strong quoting ('') 과 2가지 command substitution ($() 와 ``) 의 특성을 보여주는 예이다.
` `을 사용할 때 특히 주의해야할 점은 ` ` 안에 있는 ' ' 에 까지 ` `의 escaping이 적용된다는 점이다.
그리고 ` ` 의 escaping은 string quoting의 escaping 과는 다르다는 것이다. 예를들어 \"은 적용이 안된다. (오타정정 : but \s --> but \")
$() 은 그안에 escaping이 never!! 절대로 적용되지 않는다..
심지어 "$(~~"~~"~$(...)~)" 의 문법도 가능하다.
또 주의해야할 점이 "`~~`" 의 경우이다. 이 경우에는 ~~ 부분에 대해 ` `의 escaping 규칙과 " "의 escaping 규칙이 같이 적용된다. (100% 정확하진 않고... 개인적인 경험/실험에 의한 의견이다)
하지만 \\ 등에 대해서 중복 escaping 처리가 되는 것은 아니다.
또 echo "`echo "asdf"`" 이 가능하다... echo "`echo "`"의 오류메시지는 command substitution 과정에서의 오류메시지이다.
따라서 " ` " " ` " 꼴은 가능하다.
음.. 내부적으로 bash의 parsing 방법이 코드단에서 궁금해지는 부분이다...
` `와 다르게 $() 는 escaping이 없기 때문에 ` ` 보다 한 눈에 코드가 보인다.
위를 이해할 수 있겠는가? 머리가 약간 아플 것이다 ㅋㅋ
아마 위가 이번 강의(?)의 결정판이다~~
머리 식힐 겸 위를 보자. strong quoting 의 특성을 보여준다.
위는 변수를 quoting 해주는 게 중요하다는 것을 다시 한번 알려준다.
뭔가 많은 것을 하였다. 대략적으로 중요한 것을 정리해보자.
1. 변수 quoting 은 매우 중요하다. 변수를 weak quoting 해야지 그 변수 값 자체를 의미할 수 있게 된다. 만약 quoting 하지않으면 코드가 변조되는 보안상 취약점을 유발할 수 있다. (http://unix.stackexchange.com/questions/171346/security-implications-of-forgetting-to-quote-a-variable-in-bash-posix-shells)
2. eval 은 위험하다. 사용할 때 주의에 주의를 해야한다.
3. weak quoting 과 strong quoting의 차이점에 대해 잘 알아야한다. (http://wiki.bash-hackers.org/syntax/quoting)
4. 2가지 command substitution ($( ) 과 ` `) 의 차이점에 대해 잘 알아야한다. 특히 ` `를 쓸 때 escaping에 대해서 명심하고 사용할 것!! (http://wiki.bash-hackers.org/syntax/expansion/cmdsubst)
그리고 참고로 http://wiki.bash-hackers.org/ 이 사이트는 정말 좋은 것 같다 ㅋㅋㅋ bash scripter 라면 필수로 즐겨찾기 해야할듯!
댓글
댓글 쓰기