sh를 사용하는 autoconf, 나는 shell = bash가 필요합니다. Autoconf를 강제로 사용하도록하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/161064

  •  03-07-2019
  •  | 
  •  

문제

AutoConf를 실행하고 세트 쉘을 '/bin/sh'로 구성합니다. 이것은 큰 문제를 만듭니다. autoconf의 쉘을 '/bin/bash'로 강제하는 방법은 무엇입니까?

나는 이것을 OSX에서 실행하려고 노력하고 있습니다. Linux에서 작동하고 있습니다. Linux는 shell =/bin/bash를 사용하고 있습니다. OSX 기본값 /bin /sh.

도움이 되었습니까?

해결책

GCC와 함께 Solaris에서 비슷한 문제가 있으며 '표준'기술을 사용합니다.

CONFIG_SHELL=/bin/bash ./configure ...

(또는 실제로, 나는 /bin /ksh를 사용하지만 config_shell env var를 설정하면 AutoConf 스크립트를 사용할 수있는 쉘을 알려줄 수 있습니다.)

GIT 및 GD에 대한 스크립트 구성을 확인하여 GCC 특이한 ENV VAR이 아니 었는지 확인했습니다.

다른 팁

"거대한 문제"는 무엇입니까? AutoConf는 매우 많은 비율의 쉘로 작동하는 구성 스크립트를 생성하기 위해 매우 어렵습니다. autoconf가 휴대용이 아닌 작문이 작성하는 구조의 예가 있다면 AutoConf 메일 링리스트에보고하십시오. 반면에, 당신이 겪고있는 문제가 configure에서 자신의 쉘 코드의 결과 인 경우, 휴대 가능하지 않음 (예 : bashism을 사용하고 있음)은 해결할 수없는 코드 사용을 중지하거나 필요로하는 것입니다. 사용자는 시간 구성 시간에 Shell 또는 Config_Shell을 명시 적으로 설정합니다.

당신이 겪고있는 문제가 구성을 실행하는 사용자의 환경에있는 것처럼 들립니다. Linux에서는 사용자에게 쉘이 /bin /bash에 설정되어 있지만 OS X에서는 /bin /sh로 설정됩니다. AutoConf가 생성 한 스크립트 구성은 아래로 실행중인 쉘의 초기 테스트를 수행하며 제공된 쉘에 특정 기능이없는 경우 다른 쉘을 사용하여 자체적으로 다시 시작하려고합니다. 그러나 configure.ac에 포트할 수없는 쉘 코드를 도입하는 경우 AutoConf의 주요 철학 중 하나를 위반하는 것, 즉 구성이 휴대용이어야합니다. 쉘 코드에서 진정으로 Bashism을 사용하려면 사용자가 구성 스크립트에 대한 인수로 Shell =/Bin/Bash를 전달해야합니다. 이것은 Autoconf의 버그가 아니지만 많은 사람들이 프로젝트 빌드에서 버그로 간주됩니다.

AutoConf는 "어디서나 실행될 수있는 스크립트를 생성하여 휴대 성 문제를 해결해야합니다. 그렇기 때문에 다음과 같은 기괴한 코드를 생성하는 이유입니다.

if test X$foo = X ; then ...   # check if foo is empty

대신 :

if [ "$x" = "" ] ; then ...

그런 종류의 crufty 코드는 아마도 한 번이 스크립트가 고대 Ultrix 시스템이나 그 밖의 무엇이든 실행할 수있게 해주었습니다.

쉘 차이로 인해 실행되지 않는 스크립트를 구성하는 것은 10 리터의 가스와 3 개의 여분의 타이어가있는 Formula-1 경주에 오는 것과 같습니다.

AutoConf로 구성 스크립트를 개발하고 있으며 쉘이 BASH인지 OSX 쉘인지 여부에 민감한 경우, 무언가 잘못을하고 있거나 AutoConf 사람들이 무언가를 깨뜨 렸습니다. 그것이 당신에게서 온 경우, 휴대용을 만들어 스크립트에 추가하는 쉘 조각을 수정하십시오.

쉘이 어디에 설정되고 있습니까? /bin /bash를 원할 때 /bin /sh와 함께 실행되는 것은 무엇입니까?

구성 스크립트는 야생에 존재하는 끔찍한 부서진 껍질에서도 어디서나 실행됩니다.

편집하다: 정확히 문제는 무엇입니까?

또 다른 편집: 아마도 스크립트가 이와 같은 스스로를 다시 실행하고 싶을 것입니다. 아마도 버기 일 것입니다 :

if test "$SHELL" = "/bin/sh" && test -x /bin/bash; then
    exec /bin/bash -c "$0" "$@"
fi

ln -f /bin/bash /bin/sh

: -p (아니요, 심각한 대답이 아닙니다. 제발 시스템을 통해 시스템을 호스하지 마십시오!)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top