So ändern Sie den Perl-Speicherort für / usr / bin / env

1

Ich arbeite an einer älteren Debian 6-Maschine. Es hatte eine alte Version von Perl und führte dazu, dass einige Selbsttests fehlschlugen "Test :: More Version 0.96 erforderlich" . Ich habe die neueste Version von Perl 5.22.1 heruntergeladen, sie aus Quellen erstellt und bei abgelegt /opt/perl/.

Ich habe ein Skript, das Perl verwendet, und seine Präambel lautet:

#!/usr/bin/env perl

Wenn ich das Skript ausführe, wird jedoch das alte Perl anstelle des neuen Perl verwendet. Das wird irgendwie erwartet, weil /usr/bin/env kennt Perl nicht (oder glaube ich nicht).

Wie erzähle ich env das Perl ist derjenige in /opt/perl/, und nicht /usr/bin/? Wenn möglich, möchte ich, dass es sich um eine Maschinenkonfiguration handelt (d. H. Für alle) und nicht um eine Benutzerkonfiguration (d. H. Nur für mich).


Hier ist die Manpage für env(1). Es ist nicht viel dabei und ich glaube nicht, dass es darum geht, eine neue Version eines Programms für einen Interpreter zu registrieren. Es gibt keine Manpages für env(7) (Sonstiges) oder env(8) (Verwaltung).

ENV(1)                           User Commands                          ENV(1)

NAME
       env - run a program in a modified environment

SYNOPSIS
       env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]

DESCRIPTION
       Set each NAME to VALUE in the environment and run COMMAND.

       -i, --ignore-environment
              start with an empty environment

       -0, --null
              end each output line with 0 byte rather than newline

       -u, --unset=NAME
              remove variable from the environment

       --help display this help and exit

       --version
              output version information and exit

       A mere - implies -i.  If no COMMAND, print the resulting environment.

AUTHOR
       Written by Richard Mlynarik and David MacKenzie.

...
jww
quelle
Als vorübergehende Maßnahme können Sie versuchen, perl binary in / bin umzubenennen und durch simlink in / opt zu ersetzen, um zu überprüfen, ob es funktioniert.
Oleg Bolden

Antworten:

2

Wie eine Muschel, env Verwendet $PATH um die ausführbare Datei für einen einfachen Befehlsnamen zu finden. (Anders als in der Shell werden Aliase, Funktionen und Builtins nicht zuerst getestet.) Ich habe Debian nicht zur Hand, aber auf meinem Ubuntu 14.04 (das sollte nicht viel anders sein) Standard / Paket perl ist in /usr/binund ein Testbenutzer ohne Anpassung erhält eine $PATH Einstellung von

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games 

plus die Standardeinstellung .profile prüft ob $HOME/bin existiert und wenn ja fügt es an der Front hinzu.

/usr/local/* ist genau für "systemspezifische" Overrides gedacht und ~username/bin Wenn "nur dieser Benutzer" überschreibt, sollte ein Symlink in einem von ihnen funktionieren. Alternativ könnte man setzen /opt/perl (oder vielleicht /opt/perl/bin wenn es so strukturiert ist) in deinem $PATH vor /usr/bin.

dave_thompson_085
quelle
" /usr/local/\* ist genau für "systemspezifische" Overrides gedacht ... - Das Problem hier ist, dass Perl das Verzeichnis verschmutzt, das es berührt. Es ist eine Sache, wenn es ein oder zwei Programme, ein paar Bibliotheken usw. installiert. Das ist einer der Gründe, die ich nicht verwenden wollte /usr/local.
jww