Warum zeigt SHELL in einem Csh-Skript auf / bin / sh?

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 von source <perlbrew path>/perlbrew/etc/cshrc vor der Ausführung von perlbrew use. Ich habe dieses Problem gelöst, indem ich setenv 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, aber env | 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?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.