Meu $PATH tem /a/path/com espaços/in/it
Posso executar executáveis que ficam no referido caminho simplesmente digitando seus nomes.
Mas quando tento aplicar comandos neles, eles falham com o erro não encontrado.
por exemplo. Eu tenho um script python no caminho, chamado prog.py
Se eu apenas digitar prog.py, meu shell tentará 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 o local real de prog.py, tente os mesmos comandos, eles serão executados conforme o 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 (principalmente python3) de onde eu quiser?
Acredito que o problema não seja o espaço. Você já tentou um caminho sem um espaço?
A questão é 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ê deve usar
$LD_LIBRARY_PATH
para informar onde está o arquivo. Adicionar o local do arquivo$PATH
não ajudará. Por outro lado, se você encontrar uma biblioteca ausente em tempo de compilação, precisará de outra variável (ou seja,$LIBRARY_PATH
).Portanto, a melhor solução seria adicionar shebangs adequados aos seus scripts python e colocá-los em algum lugar no arquivo
$PATH
. Se você quiser importá-los para qualquer lugar, precisará trabalhar com arquivos$PYTHONPATH
.Isso não tem nada a ver com o nome do diretório contendo espaços. Quando você executa
python3 prog.py
oufile 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#!
na parte superior (provavelmente#! /usr/bin/python3
), poderá executá-lo de qualquer lugar dizendo apenasprog.py
(nãopython3 prog.py
).A propósito, normalmente é uma boa ideia que os programas
$PATH
não contenham uma extensão que especifique sua implementação, pois isso é realmente uma violação de camadas; Eu recomendo chamá-lo apenasprog
(substitua conforme apropriado) em vez deprog.py
.É como você está referenciando o
prog.py
arquivopython3 prog.py
diz "no meu diretório de trabalho atual há 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 é pesquisado apenas por comandos - não argumentos para comandos.
Se você deseja chamar o binário python (ou qualquer outro binário como
cat
oused
ouless
ou ...), ele deve estar em seu $ PATH - que você parece ter. Para fazer referência a qualquer outro arquivo, você sempre deve fornecer um caminho relativo completo ou um caminho absoluto completo para o arquivo.