Ja, ich weiß, dass die C-Shell schlecht ist. Nein, ich habe mich nicht für C-Shell entschieden. Ja, ich würde es vorziehen, eine richtige Hülle zu verwenden. Nein, ich kann nicht zu einer besseren Shell wechseln.
Ich habe ein sehr vereinfachtes Skript:
/tmp/env_test.csh
#!/bin/csh -f env
Wenn ich dieses Skript von meinem Benutzer aus starte, der mit einer tcsh-Shell angemeldet ist, entspricht SHELL
/bin/tcsh
. Wenn ich dieses Skript von cron aus starte, entspricht SHELL
/bin/sh
.
Warum wird die SHELL nicht ordnungsgemäß aktualisiert? Was muss ich tun, um dieses Problem zu beheben?
Kommentare
- Warum ist es überhaupt ein Problem?
- @muru Nachdem Sie darüber gestolpert sind und eine Lösung gefunden haben, scheint es, dass ' ein Problem ist, da perlbrew ' anscheinend nicht angemessen " sense " Die Shell ist [t] csh, wenn
$SHELL
nicht auf die richtige Shell eingestellt ist. Wenn cron mit/bin/sh
,$SHELL=/bin/sh
ausgeführt wird, auch nach dem Starten eines C-Shell-Skripts (#!/bin/csh -f
). Perlbrew geht dann davon aus, dass ' eine Bourne-Shell ist, und verwendet Bourne-Shell-Befehle, um die Umgebung einzurichten. Dies geschieht trotz der Ausführung vonsource <perlbrew path>/perlbrew/etc/cshrc
vor der Ausführung vonperlbrew use
. Ich habe dieses Problem gelöst, indem ichsetenv SHELL /bin/csh
in das perlbrew cshrc eingefügt habe.
Antwort
Sehen Sie sich man 1 csh
an. Der Abschnitt Pre-defined and environment variables
listet auf, welche Variablen csh
definiert oder respektiert. Es gibt eine Variable shell
in Kleinbuchstaben:
shell The file in which the shell resides. This variable is used in forking shells to interpret files that have execute bits set, but which are not executable by the system. (See the descrip- tion of Non-builtin Command Execution below.) Initialized to the (system-dependent) home of the shell.
Schauen wir uns also Folgendes an:
% echo $shell /bin/csh
Kommentare
- Nach dem, was ich nach einer Reihe von Tests feststellen kann, ist $ shell keine echte Umgebung Variable, sondern eine von der Shell interpretierte Variable.
echo $shell
gibt/bin/tcsh
aus dem Skript zurück, aberenv | grep -i shell
findet nicht die richtige Variable in cron. Nach meinem Verständnis von anderen Stellen (z. B. diese Antwort )$SHELL
sollte gesetzt sein. In meiner aktiven Login-Shell ist dies der Fall. Der einzige Ort, an dem ich ' nicht$SHELL
erhalte, ist cron.
Antwort
Sie sollten die Variable SHELL
festlegen Um /bin/csh
in Ihrem Crontrab zu verwenden, können Sie die Cron-Umgebungsvariable überprüfen durch:
* * * * * env > ~/cron-env tail -f ~/cron-env
Die Standardeinstellung SHELL
sollte auf /bin/sh
gesetzt werden.
SO: Wie simuliert man die Umgebung, mit der cron ein Skript ausführt?