Por que preciso digitar './' antes de executar um programa no diretório atual?

89

Durante a execução de um programa em C, a.out , usando o terminal do Ubuntu, por que eu sempre preciso digitar ./ antes de a.out , em vez de apenas escrever a.out ? Existe solução para isso?

    
por Prashant Chikhalkar 16.07.2013 / 13:58

10 respostas

115

Quando você digita o nome de um programa, como a.out , o sistema procura o arquivo em seu PATH. No meu sistema, o PATH está definido para

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

O seu é provavelmente semelhante. Para verificar, digite echo $PATH em um terminal.

O sistema examina esses diretórios na ordem indicada e, se não conseguir encontrar o programa, produzirá um erro command not found .

Preencher o comando com ./ efetivamente diz "esqueça o PATH, quero que você olhe apenas no diretório atual".

Da mesma forma, você pode dizer ao sistema para procurar em apenas outro local específico, prefixando o comando com um caminho relativo ou absoluto, como:

../ significa no diretório pai, por exemplo, ../hello procura por hello no diretório pai.

./Debug/hello : "procure hello no subdiretório de depuração do diretório atual."

ou /bin/ls : "procure por ls no diretório /bin "

Por padrão, o diretório atual não está no caminho porque é considerado um risco de segurança. Veja porque é. não está no caminho por padrão? no Superusuário por quê.

É possível adicionar o diretório atual ao seu PATH, mas pelas razões dadas na pergunta vinculada, eu não o recomendaria.

    
por Warren Hill 16.07.2013 / 15:20
24

A razão para isso é simples.

Suponha que você tenha um comando com o mesmo nome de um aplicativo no diretório atual. Em seguida, executar o comando no shell invocaria seu aplicativo em vez do comando interno. Isso seria uma preocupação de segurança, se nada mais.

Ao exigir que ./ seja usado na frente, o shell sabe que você deseja executar o aplicativo com o nome fornecido e não um comando interno com esse nome.

    
por Nathan Osman 16.12.2010 / 04:21
16

./ executa os arquivos que não estão no seu $PATH , em vez disso, ele executa o arquivo no diretório atual (ou outro via ./home/stefano/script.sh ). Agora, o PATH é uma variável de ambiente que contém todos os lugares onde o bash pode procurar por programas executáveis, sem ter o caminho completo (absoluto) para eles.

Esta separação é necessária para evitar a execução do arquivo errado. Ou seja se você tiver um arquivo chamado ls em seu diretório inicial, ele não estará no seu PATH e impedirá o bash de confundi-lo com o% realls. A variável PATH também define a ordem de pesquisa:

  • Quando você executa um comando, ou um programa tenta fazer um exec syscall (um método especial do Kernel, como os programas são iniciados), o sistema procura o arquivo passando por cada um dos diretórios em seu PATH . Depois que o programa for encontrado, mesmo que esteja em vários diretórios, a pesquisa será interrompida e a primeira encontrada será executada.

Para executar um arquivo, você precisará definir o bit executável nas permissões:

  • Como você já está na linha de comando, basta digitar chmod +x finename .

  • Ou você pode definir as permissões clicando com o botão direito do mouse no arquivo e selecionando Propriedades :

Agora você pode copiar o arquivo para qualquer um dos diretórios no PATH, para ver quais estão lá - e eles são definidos por usuário - tipo echo $PATH .

stefano@3000-G530:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Se você criar um arquivo executável, cat e movê-lo para /usr/local/sbin , ele será executado em vez do cat adequado, que reside em /bin . Você pode descobrir onde seus arquivos estão usando type cat e whereis cat .

    
por Stefano Palazzo 16.12.2010 / 04:18
11

Por que você precisa digitar ./ antes de executar um programa?

No terminal, sempre que você digitar o nome de um aplicativo, digamos gedit , o terminal irá procurar em alguns diretórios (pré-definidos) que contenham aplicativos (os binários dos aplicativos). Os nomes desses diretórios estão contidos em uma variável chamada PATH . Você pode ver o que há nesta variável executando echo $PATH . Veja os diretórios separados por : ? Esses são os diretórios nos quais o terminal irá procurar, se você digitar apenas gedit , nautilus ou a.out . Como você pode ver, o caminho do seu programa a.out não está lá. Quando você faz ./a.out , você está dizendo ao terminal "olhe no diretório atual, e execute a.out , e não procure em PATH .

Solução 1

Se você não quiser digitar ./ a cada vez, precisará adicionar o diretório a.out em $PATH . Nas instruções a seguir, presumo que o caminho para a.out é /path/to/programs/ , mas você deve alterá-lo para seu caminho real.

  1. Basta adicionar a linha a seguir ao final do arquivo ~/.pam_environment :

    PATH DEFAULT=${PATH}:/path/to/programs
    

    Fonte: Variáveis de ambiente persistentes

  2. Faça logout e faça o login novamente. Agora você poderá executar a.out sem ./ em qualquer diretório.

Se você tiver outros programas em outros diretórios, basta adicioná-los à linha acima. No entanto, aconselho ter um diretório chamado "myPrograms", por exemplo, e colocar todos os seus programas sob ele.

Solução 2

Note: change userName to your actual Ubuntu username.

E se você tiver outros programas que deseja executar? E eles estão todos em pastas diferentes? Bem, uma solução "mais organizada" seria criar uma pasta chamada bin em seu diretório pessoal e adicionar links simbólicos (atalhos) nessa pasta. Veja como:

  1. mkdir /home/userName/bin

    • Isso criará a pasta bin em seu diretório pessoal.
  2. ln -s /path/to/programs/a.out /home/userName/bin

    • Isso criará um "link simbólico" (basicamente, um atalho) do seu programa a.out em bin .
  3. Faça logout e faça o login novamente. Agora você poderá executar a.out sem ./ em qualquer diretório.

Agora, sempre que você tiver outro programa em qualquer outro lugar, digamos que o programa b.in na sua área de trabalho, tudo que você precisa fazer é: ln -s /home/userName/Desktop/b.in /home/userName/bin , e você poderá executá-lo sem ./ bem.

Note: thanks to @Joe's comment, when you do backups, symbolic links have to be handled specially. By default, rsync doesn't process them at all, so when you restore, they're not there.

    
por Alaa Ali 16.07.2013 / 15:27
1

Como George apontou em sua resposta, isso ajuda a perceber que você está executando um arquivo no diretório de trabalho atual ( pwd ).

Lembro-me de fazer essa pergunta para o meu senior há muito tempo, ele disse que eu deveria adicionar . ao meu caminho para que, quando eu fizesse a.out , ele aparecesse no diretório atual e executasse isso. Nesse caso, não preciso fazer ./a.out .

Mas, pessoalmente, eu recomendaria contra isso. Isso nunca aconteceu comigo, mas se você estiver em um diretório de rede alienígena ou algo assim, e um arquivo executável malicioso chamado ls existir lá, ter . em seu caminho é uma idéia muito ruim. Não que você se deparará com esse problema com muita frequência, apenas dizendo.

    
por Shrikant Sharat 16.12.2010 / 04:32
0

A './' faz sentido quando você executa um programa que é conhecido por você e específico, por exemplo seu próprio. Este programa deve estar presente em seu diretório atual. Um './' não faz sentido quando você executa um comando padrão que está em algum lugar no $ PATH. Um comando "qual comando a executar" informa onde o comando a executar está no $ PATH.

    
por user7346 16.12.2010 / 12:06
0
$ gcc hello.c -o /path/to/someplace/hello

produzirá um executável em algum local. Se esse local estiver no seu caminho, você poderá executar o arquivo. Você pode fazer o script, se você gosta de criar um rótulo para a ação "compilar este código-fonte usando o gcc e colocar um executável em algum local que está no seu caminho"

Sugiro que você crie um novo diretório chamado "testbin" ou algo desse tipo e coloque-o em seu caminho para manter limpos os diretórios de caminho existentes.

    
por Jon Kiparsky 16.07.2013 / 20:35
0

./ elimina a pesquisa desnecessária por um caminho. ./ force a pesquisar apenas no diretório atual. Se não dermos ./ , ele pesquisará vários caminhos definidos no sistema como /usr/bin , /usr/sbin/ , etc.

    
por user175959 17.07.2013 / 13:11
0

"./" significa que você quer executar um arquivo no diretório atual, é um atalho para digitar o caminho inteiro, por exemplo:

[root@server ~]#/path/to/file/file.pl

é o mesmo que:

[root@server file]#./file.pl

No exemplo anterior, você passou pelo diretório e seus diretórios para o local do arquivo e usou "./" para executar o arquivo no diretório atual.

o anterior " [root @ server ~] # / caminho / para / file / file.pl " também executará o arquivo se você preguiçar a "cd" seu caminho para o arquivo localização.

    
por Khaled Moustafa 25.04.2014 / 02:20
-4

É muito simples e tem muitos usos.

  1. Quando várias versões do mesmo aplicativo são instaladas, elas estarão disponíveis em um caminho diferente, mas um link flexível para seu binário pode ser criado em /usr/bin . Por exemplo, o Python 2.7, o Python 2.6 está instalado, mas o / usr / bin / python - > python2.7 / usr / local / bin / python - > python2.6

Se você estiver no caminho /usr/local/bin e executar o Python, ele sempre executará o Python 2.7. A especificação de . levará o executável da pasta atual.

  1. . - sempre representa executar a partir do diretório atual. E .. sempre significa execuções do diretório anterior.
por Ramjee Anna 17.07.2013 / 11:12