Bash 스크립트는 변수를 경로의 일부로 인식하지 않습니다.

Bash 스크립트는 변수를 경로의 일부로 인식하지 않습니다.

이 if 문은 다음과 같습니다.

if [ -n ${OSSIEHOME} ] && [ -d ${OSSIEHOME}/share/aclocal/ossie ]; then
    OSSIE_AC_INCLUDE=${OSSIEHOME}/share/aclocal/ossie
else
    echo "Error: Cannot find the OSSIE aclocal files. This is not expected!"

항상 기본 오류 메시지입니다. 명령줄에서 실행 OSSIEHOME하면 값이 있다는 것을 알고 있습니다 .echo $OSSIEHOME

/usr/local/redhawk/core

해당 경로를 스크립트에 하드코딩하면 정상적으로 작동합니다. 문제는 다른 더 큰 스크립트가 있어서 올바른 경로를 하드코딩할 수 없다는 것입니다. 내가 뭘 잘못했나요?

편집: od -c <<<"$OSSIEHOME"이것을 주세요:

0000000 / u s r / l o c a l / r e d h a
0000020 w k / c o r e \n
0000030

ls -l /usr/local/redhawk/core/share/aclocal/나에게 이것을 주었다:

drwxr-xr-x 2 root root 4096 Jul 19 10:02 ossie

스크립트를 실행하면 다음 bash -x이 제공됩니다.

+ rm -f config.cache
+ '[' -e /usr/local/share/aclocal/libtool.m4 ']'
+ '[' -e /usr/share/aclocal/libtool.m4 ']'
+ /bin/cp /usr/share/aclocal/libtool.m4 acinclude.m4
+ libtoolize --force --automake
+ '[' -n ']'
+ '[' -d /share/aclocal/ossie ']'
+ echo 'Error: Cannot find the OSSIE aclocal files. This is not expected!'
Error: Cannot find the OSSIE aclocal files. This is not expected!
+ '[' -n ']'
+ aclocal -I
aclocal: error: option '-I' requires an argument
aclocal: Try '/bin/aclocal --help' for more information.
+ autoconf
+ automake --foreign --add-missing

OSSIEHOME만일을 대비해 세계화하기 위해 내보내기를 시도했지만 작동하지 않았습니다. 그런 다음 스크립트를 실행 . script.sh하려고 하는데 source script.sh문제는 sudo를 사용하여 스크립트를 실행해야 한다는 것입니다. 그렇지 않으면 작동하는 데 필요한 권한이 없습니다. 이렇게 했는데 오류가 발생하면

sudo: source: command not found

답변1

해당 문제는 질문 댓글에서 진단되었습니다. 내 대답에서는 무슨 일이 일어났는지, 그리고 어떻게 해결하는지 설명하겠습니다.

암호

if [ -n ${OSSIEHOME} ] && [ -d ${OSSIEHOME}/share/aclocal/ossie ]; then

따옴표 없이 변수 확장을 사용하고 있으므로 위험합니다. "${OSSIEHOME}"또는 "$OSSIEHOME"변수 값으로 확장하되 ${OSSIEHOME}바깥쪽 따옴표를 단어로 분할합니다. 특히, 연산자 왼쪽에 있는 명령은 변수가 비어 있거나 설정되지 않은 경우 true &&로 확장됩니다 . 실행 후 생성된 추적에서 이를 확인할 [ -n ]수 있습니다 . 바라보다bash -x[ -n ]공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?자세한 내용은. 이제부터 변수와 명령 대체에는 항상 큰따옴표를 넣어야 한다는 점을 기억하세요.

if [ -n "${OSSIEHOME}" ] && [ -d "${OSSIEHOME}/share/aclocal/ossie" ]; then

이렇게 하면 손상된 오류 보고가 수정됩니다. 그러나 스크립트가 실행될 때 변수가 설정되었는지 확인해야 합니다. echo $OSSIEHOME현재 쉘에 무언가가 인쇄되었는지 확인하는 것만으로는 충분하지 않습니다. 변수가 환경에 있는지 확인해야 합니다. run 을 실행하면 OSSIEHOME=/usr/local/redhawk/core쉘 변수만 설정됩니다. 환경 변수를 설정하려면 실행 export OSSIEHOME=/usr/local/redhawk/core(또는 OSSIEHOME=/usr/local/redhawk/core그런 다음 ) 해야 합니다 export OSSIEHOME.

스크립트를 호출하여 이 작업을 수행한다고 덧붙였습니다 sudo. 일반적인 구성에서 sudo는 환경에서 대부분의 변수를 제거합니다. (이는 사용자가 특정 명령만 실행하도록 허용할 때 보안에 매우 중요하지만 sudo를 사용하여 임의의 명령을 실행하도록 허용하는 경우 번거롭고 강력한 보안 이점을 제공하지 않습니다.) 따라서 sudo에게 실행하도록 명시적으로 지시해야 합니다. 이 변수는 다음과 같은 경우에 설정됩니다. 스크립트를 실행하는 경우.

sudo OSSIEHOME=/usr/local/redhawk/core /path/to/your/script

변수가 쉘 환경에 이미 설정되어 있고 값을 반복하지 않으려면 다음을 사용할 수 있습니다.

sudo OSSIEHOME="$OSSIEHOME" /path/to/your/script

또는 실행이 허용되거나 허용되지 않을 수도 있습니다 sudo -E /path/to/your/script. 이 -E옵션은 sudo가 대부분의 환경 변수를 보존하도록 지시합니다.

sudo를 실행 source하거나 .사용해도 실행 가능한 명령이 아니라 셸 내장 명령이므로 아무런 효과가 없습니다. 이들의 임무는 다음과 같습니다. 스크립트 실행이미 실행 중인 동일한 쉘즉, 별도의 프로그램을 실행하는 것이 아니라 파일에서 명령을 읽으라는 셸의 명령입니다. 이는 sudo에서는 의미가 없습니다. 스크립트가 동일한 셸 프로세스에서 실행되면 동일한 권한으로 실행됩니다.

1 고급 사용자의 경우 "생략해야 하는 이유를 모르는 경우"를 추가합니다.

관련 정보