/usr/bin/env Fragen zu shebang Zeile Eigenheiten
Fragen:
- Was macht der kernel tun, wenn Sie stick ein shell-Skript in der shebang-Zeile?
- Wie funktioniert der Kernel wissen, welcher interpreter zu starten?
Erklärung:
Ich neulich schreiben wollte, ein wrapper um /usr/bin/env weil mein CGI-Umgebung nicht erlauben, mich um die PFAD Variablen, außer Global (was natürlich nervt!).
Also dachte ich mir, "OK. Lassen Sie uns den PREPENDPATH-und set PFAD in ein wrapper um " env.". Das resultierende Skript (hier genannt env.1) sah so aus:
#!/bin/bash
/usr/bin/env PATH=$PREPENDPATH:$PATH $*
sieht aus wie es funktionieren sollte. Ich habe geprüft, wie Sie beide reagieren nach der Einstellung PREPENDPATH:
$ which /usr/bin/env python
/usr/bin/env
/usr/bin/python
$ which /usr/bin/env.1 python
/usr/bin/env
/home/pi/prepend/bin/python
Look absolut perfekte! So weit, So gut. Aber schauen Sie, was passiert, um "Hallo Welt!".
# Shebang is #!/usr/bin/env python
$ test-env.py
Hello World!
# Shebang is #!/usr/bin/env.1 python
$ test-env.1.py
Warning: unknown mime-type for "Hello World!" -- using "application/*"
Error: no such file "Hello World!"
Ich glaube, ich bin fehlt etwas grundlegendes zu UNIX.
Ich bin ziemlich verloren, auch nach einem Blick auf den source-code des ursprünglichen env. Es stellt die Umgebung und startet das Programm (oder so scheint es mir...).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste von allen, sollten Sie sehr selten benutzen
$*
und Sie sollten fast immer"$@"
statt. Es gibt eine Reihe von Fragen auf, SO die erklären, die ins und outs der, warum.Zweite - die
env
Befehl hat zwei Haupt-Anwendungen. Man ist zum drucken der aktuellen Umgebung; die andere ist, die komplette Kontrolle über die Umgebung des einen Befehl aus, wenn es ausgeführt wird. Die Dritte, die Sie zeigen, ändern Sie die Umgebung, aber ehrlich gesagt, es gibt keine Notwendigkeit die Schalen sind durchaus in der Lage Umgang mit, dass für Sie.Modus 1:
Modus 2:
Diese version bricht alle geerbten Umgebungsvariablen und läuft
command
mit exakt der Umwelt festgelegt, die durch die ENVVAR=Wert-Optionen.Dritten Modus zur änderung des Umwelt - ist weniger wichtig, weil Sie tun können, die gut mit regelmäßigen (zivilisierten) Muscheln. (Das heißt nicht "C-shell" - gibt es wieder andere Fragen auf, SO dass Antworten, die erklären, dass.) Sie könnten zum Beispiel sehr gut tun:
Dieser besteht darauf, dass
$PREPENDPATH
einen nicht-leeren string in der Umwelt, und dann stellt es$PATH
ab und exportiert den neuen PFAD einstellen. Dann, mit diesem neuen WEG, er führt diepython
Programm mit den entsprechenden Argumenten. Dieexec
ersetzt den shell-Skript mitpython
. Beachten Sie, dass dies ganz anders aus:Oberflächlich, das ist das gleiche. Jedoch, dies wird ausgeführt, die
python
gefunden, die auf den bestehenden PFAD, wenn auch mit dem neuen Wert von PATH in der Prozess-Umgebung. Also, in dem Beispiel, würden Sie am Ende ausführen von Python aus/usr/bin
und nicht das von/home/pi/prepend/bin
.In Ihrer situation wäre, würde ich wahrscheinlich nicht verwenden
env
und würde nur mit einer entsprechenden Variante des Skripts mit den expliziten export.Den
env
Befehl ist ungewöhnlich, weil es nicht erkennt, der Doppel-Bindestrich zu trennen Optionen aus dem rest des Befehls. Dies ist zum Teil, weil es nicht viele Optionen, und zum Teil, weil es nicht klar ist, ob die ENVVAR=Wert Optionen sollten vor oder nach dem double dash.Eigentlich habe ich eine Reihe von Skripten für die Ausführung (unterschiedliche Versionen) ein Datenbank-server. Diese Skripte wirklich
env
(und ein paar " home-grown-Programme) zur Steuerung der Umgebung des Servers:#!/bin/bash
oder#!/bin/ksh
als die erste Zeile von einem Skript? Ich bin nicht fordern, oder den Nachweis, dass Sie verwenden können#!/some/script
als shebang.Sollten Sie sorgfältig Lesen Sie den wikipedia-Artikel über shebang.
Wenn Ihr system sieht die Magische Zahl entsprechend die shebang, es hat eine
execve
auf den angegebenen Pfad nach der shebang und gibt das Skript selbst als argument.Ihrem Skript schlägt fehl, weil die Datei, die Sie geben (
/usr/bin/env.1
) ist nicht eine ausführbare, sondern beginnt, sich durch ein Kram....Ideal, man könnte es lösen mit...
env
auf Ihr Skript mit dieser Zeile als shebang:Funktioniert es nicht, obwohl auf linux wie es behandelt "
/usr/bin/env.1 python
" als Pfad (nicht die split-Argumente)Also die einzige Möglichkeit die ich sehe ist, schreiben Sie Ihre
env.1
in CEDIT: scheint, wie niemand hält mich ^^, also ich geschrieben habe, eine einfache und schmutzige
env.1.c
: