La variable de entorno PWD
contiene el directorio de trabajo actual, que debería ser la ruta desde la que se ejecutó el script.
Puede derivar la ruta completa de la secuencia de comandos con $ENV{PWD}
y $0
Editar: proporcionar código de ejemplo, ya que es difícil para algunos a creer que esto es posible:
Puede que no haya recogido todo los posibles casos, pero esto debe estar muy cerca:
use strict;
use warnings;
print "PWD: $ENV{PWD}\n";
print "\$0: $0\n";
my $bin = $0;
my $bin_path;
$bin =~ s#^\./##; # removing leading ./ (if any)
# executed from working directory
if ($bin !~ m#^/|\.\./#) {
$bin_path = "$ENV{PWD}/$bin";
}
# executed with full path name
elsif ($bin =~ m#^/#) {
$bin_path = $0;
}
# executed from relative path
else {
my @bin_path = split m#/#, $bin;
my @full_path = split m#/#, $ENV{PWD};
for (@bin_path) {
next if $_ eq ".";
($_ eq "..") ? pop @full_path : push @full_path, $_;
}
$bin_path = join("/", @full_path);
}
print "Script Path: $bin_path\n";
la producción de pruebas de funcionamiento:
PWD: /tmp
$0: ../home/cmatheson/test.pl
Script Path: /home/cmatheson/test.pl
PWD: /home/cam
$0: ./test.pl
Script Path: /home/cam/test.pl
PWD: /usr/local
$0: /home/cam/test.pl
Script Path: /home/cam/test.pl
PWD: /home/cam/Desktop/foo
$0: ../../src/./git-1.7.3.2/../../test.pl
Script Path: /home/cam/test.pl
"prefiero no utilizar cualquiera de los módulos especiales" -- ¿por qué? Tenga en cuenta que también hay muchos módulos que vienen empaquetados con la distribución perl. – Ether
@ether - por la misma razón que no me gusta el ketchup en hotdogs, supongo – CheeseConQueso