autoconf sh verwenden, muss ich SHELL = BASH, wie kann ich autoconf zwingen bash zu benutzen?

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

  •  03-07-2019
  •  | 
  •  

Frage

Ich bin autoconf laufen und konfigurieren Sets Shell zu '/ bin / sh'. Dies schafft große Probleme. Wie SHELL zu zwingen, für autoconf '/ bin / bash' sein?

Ich versuche, diesen Lauf auf osx zu bekommen, ist es unter Linux funktioniert. Linux wird mit SHELL = / bin / bash. osx standardmäßig auf / bin / sh.

War es hilfreich?

Lösung

Ich habe ähnliche Probleme auf Solaris mit GCC - und ich benutze die 'Standard' Technik:

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

(Oder eigentlich, ich / bin / ksh, aber das env var CONFIG_SHELL Einstellung ermöglicht es Ihnen, autoconf Skripte zu erklären, welche Shell zu verwenden.)

überprüfte ich die Configure-Skript für git und gd (sie zufällig extrahiert werden) zu prüfen, ob diese var kein GCC eigentümlich env war.

Andere Tipps

Was sind die „große Probleme“? autoconf arbeitet sehr hart, einen Configure-Skript zu generieren, die mit einem sehr hohen Anteil an Schalen funktionieren. Wenn Sie ein Beispiel eines Konstrukts haben, dass autoconf schreibt, dass nicht tragbar ist, wenden Sie sich bitte an die Mailingliste autoconf melden. Auf der anderen Seite, wenn die Probleme, die Sie erleben ein Ergebnis des eigenen Shell-Code in configure.ac nicht tragbar sind dann die Lösung (zum Beispiel sind Sie bashisms verwenden) ist entweder zu stoppen die Verwendung von nicht-portablen Code oder benötigen Benutzer explizit SHELL oder CONFIG_SHELL bei configure Zeit.

Es klingt wie das Problem, das Sie erleben in der Umgebung des Benutzers läuft configure ist. Unter Linux Ihr Benutzer hat SHELL auf / bin / bash, aber auf OS X ist es auf / bin / sh. Das Konfigurationsskript von autoconf erzeugt hat einige erste Tests der Schale unter ausgeführt wird, und nicht versuchen, erneut exec selbst eine andere Shell verwenden, wenn die mitgelieferte Schale bestimmte Funktionen fehlen. Wenn Sie jedoch sind nicht-portable Shell-Code in configure.ac einzuführen, dann verletzen Sie eine der von autoconf Hauptphilosophie - nämlich die konfigurieren Skripte tragbar sein sollte. Wenn Sie wirklich bashisms verwenden, in der Shell-Code wollen, dann benötigen Sie Ihren Benutzer SHELL = / bin / bash als Argument an das Configure-Skript zu übergeben. Dies ist kein Fehler in autoconf, würde aber von vielen als ein Fehler zu sein in Ihrem Projekt zu bauen.

Autoconf soll Portabilität Probleme lösen, indem ein Skript zu erzeugen, die „überall“ laufen kann. Deshalb erzeugt es bizarr Code wie:

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

statt:

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

Diese Art von crufty Code wahrscheinlich einmal erlaubt diese Skripte auf einigen alten Ultrix System oder was auch immer zu laufen.

Ein Configure-Skript wegen Shell Unterschiede nicht aktiv ist wie mit 10 Litern Gas zu einem Formel-1-Rennen kommen, und drei Ersatzreifen.

Wenn Sie ein Konfigurationsskript mit Autoconf entwickeln, und es ist empfindlich, ob die Schale Bash oder die OSX-Shell, Sie tun etwas falsch, oder die Autoconf Menschen brach etwas. Wenn es von dir ist, fix was Schalenstücke an das Skript hinzufügen, indem man sie tragbar zu machen.

Wo wird auf das SHELL wird? Was mit / bin / sh ausgeführt wird, wenn Sie möchten, / bin / bash?

konfigurieren Skripte sollen überall laufen, auch auf dem schrecklich gebrochen und nicht-Bash-Shells, die in der freien Natur existieren.

Bearbeiten : Was genau ist das Problem

Eine andere bearbeiten : Vielleicht möchten Sie das Skript gerne erneut auszuführen selbst, so etwas wie dieses. Es ist wahrscheinlich Buggy:

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

ln -f /bin/bash /bin/sh

:-P (Nein, es ist nicht eine ernsthafte Antwort. Bitte Schlauch nicht Ihr System, indem es zu tun!)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top