Caminho de execução executável. Depende do local do qual o executável é chamado?

2

como ainda sou um novo usuário de Linux, ainda descubro alguns comportamentos e não consigo dizer se eles são "normais" ou não. Eu procurei na Internet, mas como não consigo encontrar uma resposta, acho que é hora de perguntar aqui.

Algumas semanas atrás, instalei um pequeno jogo chamado "Machinarium" e o joguei ... mas poucos dias depois, quando quis continuar meu jogo, não consegui fazer o jogo iniciar corretamente. E como não tive tempo para pesquisar, desisti.

Mas ontem, enquanto trabalhava em um programa meu, tive exatamente o mesmo comportamento. Então eu procurei um pouco e descobri que ao usar o Nautilus com o "List view", eu era capaz de rodar o programa (ie: o programa encontra os recursos de som, imagens etc) quando eu estava literalmente "dentro" a pasta executável , mas impossível quando eu estava em uma pasta pai e expandi-la para a pasta executável para executá-la.

Para ilustrar o comportamento, aqui estão duas capturas de tela.

  • Não funciona se o executável for clicado duas vezes daqui
  • Elefuncionaseoexecutávelforclicadoduasvezesapartirdaqui

Este é realmente o mesmo "lugar", mas a visão Nautilus é um pouco diferente, já que a pasta atual não é a mesma e parece fazer diferença para o programa.

Além disso, quando eu crio um item de menu via Configurações do Sistema / Menu Principal para o executável, ele se comporta como se o executável não encontrasse os recursos (por isso não pude jogar Machinarium a segunda vez que criei um menu curto após o meu primeiro jogo).

Por isso, pedi ao meu programa para gerar um arquivo de texto em sua raiz ao executar, e comecei a lançá-lo a partir de diferentes pastas "pai" para ver onde é gerado o arquivo de texto. Cada vez que o arquivo foi gerado na pasta superior da visualização atual do Nautilus.

Esperava-se que ele aparecesse na mesma pasta do executável (bem, não como eu estava adivinhando o que estava acontecendo, mas antes disso eu esperava vê-lo na pasta exe).

  • Alguém pode me explicar por que funciona assim (acho normal)?
  • Como devo resolver isso ao criar programas (Devo detectar o caminho do executável no meu código C ++ ou devo organizar os arquivos de recursos de outra maneira que no Windows?)
por Valkea 22.06.2011 / 01:24

2 respostas

3

Há uma boa pergunta aqui com respostas para dar uma idéia de onde instalar os aplicativos do usuário .

Para executar um aplicativo, o bit executável deve ser definido. Isso também pode ser feito no Nautilus no menu do botão direito do mouse ( Propriedades - > Permissões ).

Você pode então executar qualquer script ou binário executável clicando duas vezes no Nautilus ou executando o seguinte em um terminal (observe o comando ./ run):

./path/to/executable/application

Se o seu aplicativo precisar ser executado em seu caminho, será necessário primeiro alterar o diretório para esse caminho executando:

cd /path/to/executable
./application

Para facilitar isso, você também pode criar um Iniciador para executar o aplicativo (veja, por exemplo, esta resposta e muitas outras)

Foi assim que eu fiz isso com o Machinarium.

Não é recomendado colocar seus próprios arquivos personalizados do usuário em /usr/bin . Esse diretório pode ser sobrescrito caso você atualize seu sistema mais tarde e ele geralmente não seja incluído nas soluções de backup. Em vez disso, crie um novo diretório em seu diretório inicial: ~/bin . Você precisa se logar novamente para este diretório ser reconhecido.

    
por Takkat 22.06.2011 / 09:24
1

Sim. o PATH contém a lista de caminhos onde os comandos são pesquisados quando você os digita. Se você deseja executar um comando que não está no caminho, é necessário fornecer um caminho relativo ou absoluto ( ./file ou bin/file , por exemplo).

Esse comportamento é provavelmente um bug. O aplicativo provavelmente executa alguns arquivos em um de seus directores ( bin/ , por exemplo), mas assumindo que está sendo executado a partir do diretório raiz do machinarium (chamadas bin/file supondo que dir esteja no diretório atual), se você executá-lo de outro diretório o arquivo não será encontrado.

Uma solução alternativa é criar um script no PATH que entra no diretório machinarium e, em seguida, executa-o.

#!/bin/bash
cd /path/to/machinarium
./machinarium-or-whatever

apenas chame-o de machinarium e coloque-o sob um diretório que esteja no seu caminho (/ usr / local / bin ou um em seu / home). Você pode executar esse comando a partir de qualquer diretório.

    
por santiagozky 22.06.2011 / 01:38