Existem algumas maneiras:
$0
é o script atualmente em execução, conforme fornecido pelo POSIX, relativo ao diretório de trabalho atual, se o script estiver no CWD ou abaixo dele
- Além disso,
cwd()
, getcwd()
e abs_path()
são fornecidos pelo Cwd
módulo e dizer-lhe onde o script está sendo executado a partir de
- O módulo
FindBin
fornece as $Bin
& $RealBin
variáveis que geralmente são o caminho para o script em execução; este módulo também fornece $Script
& $RealScript
esse é o nome do script
__FILE__
é o arquivo real com o qual o interpretador Perl lida durante a compilação, incluindo seu caminho completo.
Eu vi os três primeiros ( $0
, o Cwd
módulo e o FindBin
módulo) falharem mod_perl
espetacularmente, produzindo uma saída sem valor, como '.'
uma string vazia. Nesses ambientes, eu uso __FILE__
e obtenho o caminho usando o File::Basename
módulo:
use File::Basename;
my $dirname = dirname(__FILE__);
__FILE__
) não funciona como o esperado? Termino com o caminho relativo de onde o script foi executado, enquanto a resposta aceita me fornece o caminho absoluto completo.dirname(__FILE__)
não segue links simbólicos; portanto, se você vinculou o arquivo executável e onde espera encontrar o local de outro arquivo no local de instalação, é necessário verificarif( -l __FILE__)
e depoisdirname(readlink(__FILE__))
.perl -e 'use Module::CoreList; print Module::CoreList->first_release("File::Basename");'; echo
. PoisFile::Basename
esse foi o Perl 5.0.0, que foi lançado no final dos anos 90 - acho que é preciso usar agora.Normalmente, $ 0 é o nome do seu programa, e quanto a isso?
Parece-me que isso deve funcionar como abs_path sabe se você está usando um caminho relativo ou absoluto.
Atualização Para quem ler este ano depois, leia a resposta de Drew . É muito melhor que o meu.
fonte
realpath
, que é um sinônimo paraabs_path
, no caso de você preferir o nome não-sublinhadoperl -e 'use Cwd "abs_path";print abs_path($0);'
prints #/tmp/-e
-e
), acredito que o perl cria um arquivo temporário para armazenar seu script embutido. Parece que a localização, no seu caso, é/tmp
. O que você esperava que fosse o resultado?http://perldoc.perl.org/File/Spec/Unix.html
fonte
Eu acho que o módulo que você está procurando é o FindBin:
fonte
Você pode usar FindBin , Cwd , File :: Basename ou uma combinação deles. Eles estão todos na distribuição básica do Perl IIRC.
Eu usei Cwd no passado:
Cwd:
fonte
Obter o caminho absoluto para
$0
ou__FILE__
é o que você deseja. O único problema é se alguém fez umchdir()
e o$0
foi relativo - então você precisa obter o caminho absoluto em umBEGIN{}
para evitar surpresas.FindBin
tenta melhorar e procurar$PATH
algo parecido com obasename($0)
, mas há momentos em que isso faz coisas muito surpreendentes (especificamente: quando o arquivo está "bem na sua frente" no cwd).File::Fu
temFile::Fu->program_name
eFile::Fu->program_dir
para isso.fonte
chdir()
em tempo de compilação?Alguns antecedentes curtos:
Infelizmente, a API do Unix não fornece um programa em execução com o caminho completo para o executável. De fato, o programa que executa o seu pode fornecer o que ele deseja no campo que normalmente informa ao seu programa o que é. Como todas as respostas apontam, existem várias heurísticas para encontrar possíveis candidatos. Mas nada menos que pesquisar em todo o sistema de arquivos sempre funcionará, e mesmo isso falhará se o executável for movido ou removido.
Mas você não deseja o executável Perl, que é o que está realmente sendo executado, mas o script que está sendo executado. E o Perl precisa saber onde o script está. Ele armazena isso
__FILE__
enquanto$0
é da API Unix. Ainda pode ser um caminho relativo, então pegue a sugestão de Mark e canonize-a comFile::Spec->rel2abs( __FILE__ );
fonte
__FILE__
ainda me dá um caminho relativo. ie '.'.Você tentou:
ou
Realmente depende de como está sendo chamado e se é CGI ou está sendo executado a partir de um shell normal, etc.
fonte
Para obter o caminho para o diretório que contém meu script, usei uma combinação de respostas já fornecidas.
fonte
O perlfaq8 responde a uma pergunta muito semelhante ao usar a
rel2abs()
função on$0
. Essa função pode ser encontrada em File :: Spec.fonte
Não é necessário usar módulos externos; com apenas uma linha, você pode ter o nome do arquivo e o caminho relativo. Se você estiver usando módulos e precisar aplicar um caminho relativo ao diretório de scripts, o caminho relativo será suficiente.
fonte
: DD
fonte
Você está procurando isso ?:
A saída terá a seguinte aparência:
Funciona no Windows e no Unix.
fonte
fonte
O problema
__FILE__
é que ele imprimirá o caminho ".pm" do módulo principal, não necessariamente o caminho de script ".cgi" ou ".pl" que está sendo executado. Acho que depende do seu objetivo.Parece-me que
Cwd
só precisa ser atualizado para mod_perl. Aqui está a minha sugestão:Por favor, adicione sugestões.
fonte
Sem nenhum módulo externo, válido para shell, funciona bem mesmo com '../':
teste:
fonte
O problema de apenas usar
dirname(__FILE__)
é que ele não segue links simbólicos. Eu tive que usar isso no meu script para seguir o link simbólico para o local do arquivo real.fonte
Na verdade, todas as soluções sem biblioteca não funcionam por mais de algumas maneiras de escrever um caminho (pense ../ ou /bla/x/../bin/./x/../ etc. Minha solução parece Tenho uma peculiaridade: não tenho a menor idéia do porquê de executar as substituições duas vezes. Se não tiver, recebo um "./" ou "../" falso. Além disso, ele parece bastante robusto para mim.
fonte
Nenhuma das respostas "principais" foi adequada para mim. O problema com o uso de FindBin '$ Bin' ou Cwd é que eles retornam caminho absoluto com todos os links simbólicos resolvidos. No meu caso, eu precisava do caminho exato com links simbólicos presentes - o mesmo que retorna o comando Unix "pwd" e não "pwd -P". A seguinte função fornece a solução:
fonte
No Windows, usar
dirname
eabs_path
juntos funcionou melhor para mim.aqui está o porquê:
fonte
O que há de errado
$^X
?Daria a você o caminho completo para o binário Perl sendo usado.
Evert
fonte
No * nix, você provavelmente possui o comando "whereis", que pesquisa seu $ PATH procurando um binário com um nome específico. Se $ 0 não contiver o nome completo do caminho, executar whereis $ scriptname e salvar o resultado em uma variável deve informar onde o script está localizado.
fonte