Como aplicar o comando para arquivar em $ PATH com espaços?

0

Meu $ PATH tem / a / path / com espaços / in / it

Eu posso executar executáveis que se encaixam no caminho, simplesmente digitando seus nomes.

Mas quando eu tento aplicar comandos neles, eles não conseguem encontrar um erro.

por exemplo. Eu tenho um script python no caminho, chamado prog.py

Se eu apenas digitar prog.py, meu shell tenta executá-lo. Então o caminho está funcionando. Mas:

$ python3 prog.py

python3: can't open file 'prog.py': [Errno 2] No such file or directory

$ file prog.py

prog.py: cannot open 'prog.py' (No such file or directory)

Se eu cd para a localização real do prog.py, tente os mesmos comandos, eles são executados como esperado:

$ file ./prog.py

./prog.py: Python script, ASCII text executable

$ python3 ./prog.py

True

Por que isso acontece? E o que posso fazer para executar esses comandos (particularmente python3) de onde eu quiser?

    
por markling 06.12.2017 / 20:29

3 respostas

2

Isso não tem nada a ver com o nome do diretório contendo espaços. Quando você executa python3 prog.py ou file prog.py , está especificando um caminho relativo e a semântica padrão do Unix significa que ele será aberto a partir do diretório de trabalho atual. Não há uma maneira sensata de mudar isso.

No entanto, se você tornar o script executável ( chmod +x /path/to/prog.py ) e garantir que ele tenha uma linha #! correta no topo (provavelmente #! /usr/bin/python3 ), então você poderá executá-lo de qualquer lugar dizendo apenas prog.py (não python3 prog.py ).

Aliás, normalmente é uma boa ideia que programas em $PATH não contenham uma extensão que especifique sua implementação, já que isso é realmente uma violação de camadas; Eu recomendaria chamá-lo apenas de prog (substitua conforme apropriado) em vez de prog.py .

    
por 06.12.2017 / 20:54
2

Eu acredito que a questão não é com o espaço. Você já tentou um caminho sem espaço?

O ponto é que $PATH são os caminhos para procurar executáveis, não arquivos de tipo aleatório.

Por exemplo, se você tem um executável que reclama de uma biblioteca ausente, você tem que usar $LD_LIBRARY_PATH para dizer onde está o arquivo. Adicionar a localização do arquivo a $PATH não ajudará. Por outro lado, se você encontrar uma biblioteca ausente em tempo de compilação, precisará de outra variável (a saber, $LIBRARY_PATH ).

Portanto, a melhor solução seria adicionar shebangs apropriados aos seus scripts python e colocá-los em algum lugar no $PATH . Se você quiser importá-los em qualquer lugar, precisará trabalhar com $PYTHONPATH .

    
por 06.12.2017 / 20:53
0

É como você está referenciando o arquivo prog.py

python3 prog.py diz "no meu diretório de trabalho atual existe um arquivo chamado prog.py"

Seu segundo exemplo - onde você usa ./prog.py - você está declarando explicitamente "no diretório atual você encontrará um programa chamado prog.py"

Seu $ PATH é procurado apenas por comandos - não por arugmentar comandos.

Se você quiser chamar o binário python (ou qualquer outro binário como cat ou sed ou less ou ...) então ele deve estar em seu $ PATH - o qual você parece ter. Para fazer referência a qualquer outro arquivo, você deve sempre fornecer um caminho relativo completo ou um caminho absoluto completo para o arquivo.

    
por 06.12.2017 / 20:54

Tags