변수와 같은 복잡한 명령을 구성하는 쉘 스크립트를 작성 중입니다 (예 : Bash FAQ에서 배운 기술 사용 ).
#!/bin/bash
SOME_ARG="abc"
ANOTHER_ARG="def"
some_complex_command \
${SOME_ARG:+--do-something "$SOME_ARG"} \
${ANOTHER_ARG:+--with "$ANOTHER_ARG"}
이 스크립트는 동적 매개 변수를 추가 --do-something "$SOME_ARG"하고 --with "$ANOTHER_ARG"에 some_complex_command이러한 변수가 정의 된 경우. 지금까지 이것은 잘 작동합니다.
그러나 이제는 명령을 실행할 때 (예 : 스크립트가 디버그 모드에서 실행될 때) 명령을 인쇄하거나 기록 할 수 있기를 원합니다. 따라서 스크립트가 실행될 some_complex_command --do-something abc --with def때이 명령을 변수 안에 넣고 syslog에 기록 할 수 있습니다.
Bash FAQ는 이 목적으로 트랩과 변수 (예 : 디버깅 목적) 를 사용DEBUG$BASH_COMMAND 하는 기술을 보여줍니다 . 다음 코드를 사용하여 시도했습니다.
#!/bin/bash
ARG="test string"
trap 'COMMAND="$BASH_COMMAND"; trap - DEBUG' DEBUG
echo "$ARG"
echo "Command was: ${COMMAND}"
이것은 작동하지만 명령의 변수를 확장하지는 않습니다.
host ~ # ./test.sh
test string
Command was: echo "$ARG"
나는 eval을 사용하여 확장해야한다고 생각 echo "$ARG"합니다 echo test string(적어도 eval아직 없는 방법은 찾지 못했습니다). 다음은 작동합니다.
eval echo "Command was: ${COMMAND}"
다음과 같은 출력을 생성합니다.
host ~ # ./test.sh
test string
Command was: echo "$ARG"
Command was: echo test string
그러나 eval이와 같이 안전하게 사용할 수 있는지 확실하지 않습니다 . 나는 몇 가지를 악용하려고 시도했습니다.
#!/bin/bash
ARG="test string; touch /x"
DANGER='$(touch /y; cat /etc/shadow)'
trap 'COMMAND="$BASH_COMMAND"; trap - DEBUG' DEBUG
echo "$ARG" $DANGER
echo "Command was: ${COMMAND}"
eval echo "Command was: ${COMMAND}"
잘 처리하는 것 같지만 다른 사람이 내가 놓친 문제를 발견하면 궁금합니다.