Я использовал Cwd 'abs_path', чтобы получить точное местоположение нашего скрипта, содержащего общие значения параметров и функции, чтобы они были взаимозаменяемыми в наших средах dev / qa / uat / prod.
Пример кода:
#!/usr/bin/perl
use strict;
use Cwd 'abs_path';
my $script_path = abs_path($0);
my @folders = split(/\//,$script_path);
my $env = $folders[3];
my $file_loc "/prod/ops/$env/env_shared/ulvr_env.pl";
print "$0\n";
print "$script_path\n";
print "$env\n";
print "file location: $file_loc\n";
$ env будет преобразовываться в 'dev', 'qa', 'uat' или 'prod' в зависимости от каталога, в котором находится скрипт. Этот код хорошо работал до сих пор. Наш производственный сервер по-прежнему имеет абсолютный путь «/ prod», но из-за нехватки места мы переместили наши сценарии из «/ prod» в «/ data / prod» с помощью символической ссылки.
Результаты:
$ ./test_path.pl
/prod/ops/prod/test_path.pl
prod
file location: /prod/ops/prod/env_shared/ulvr_env.pl
Как видите, он возвращает абсолютный путь (как и должно быть), поэтому мне нужно знать, как я могу универсально определить, какой путь использовать для ulvr_env.pl в зависимости от того, запущен ли скрипт в prod, dev, qa или уат. этот (эти) сценарии должны работать одинаково независимо от того, используется ли полный путь для выполнения или используется относительный путь. Я пытался использовать:
use File::Spec;
my $script_path = File::Spec->rel2abs( $0) ;
, который работает при запуске скрипта с указанием полного символьного пути, но не работает при попытке запуска с cwd
$ /prod/ops/qa/test_path.pl
/prod/ops/qa/test_path.pl
ops
file location: /prod/ops/qa/env_shared/ulvr_env.pl
$ ./test_path.pl
/data/prod/ops/qa/test_path.pl
ops
file location: /prod/ops/ops/env_shared/ulvr_env.pl
Каков наилучший способ заставить его возвращать "qa", "uat" или "prod" без необходимости поддерживать различный код для каждого местоположения?