O que é ./ in BASH

3

Eu estava brincando em uma concha e digitei. Eu vou a seguinte saída:

bash: ./: Is a directory

Parece que "./" verifica se existe um diretório com o nome fornecido. Eu estava tentando encontrar documentação sobre isso para ver se meu entendimento estava correto, mas não encontrei nada on-line. Alguém pode me explicar isso?

Andi Jay
fonte
Não. ./é o mesmo que ., que é o diretório atual. E não apenas no Linux ou apenas no shell bash.
Hennes
Bem, eu me sinto como um idiota. Obrigado pelas respostas embora.
Andi Jay

Respostas:

8

Uma definição geral para isso provavelmente não é encontrada no manual Bash, mas na especificação POSIX (seção Pathname Resolution):

O ponto especial do nome do arquivo deve se referir ao diretório especificado pelo seu predecessor.

Bem, o que é o antecessor, se tivermos apenas .? Eu enfatizei a parte importante:

Se o nome do caminho não começar com uma barra, o predecessor do primeiro nome de arquivo do nome do caminho será considerado o diretório de trabalho atual do processo.

Além disso,

Um nome de caminho que contenha pelo menos um caractere não-slash e que termine com uma ou mais barras finais será resolvido como se um único caractere de ponto ('.') Fosse anexado ao nome do caminho.

Então, quando você digita ./, é resolvido como ./., que basicamente aponta para o seu diretório de trabalho atual. Quando você digita algo em seu shell e acerta Enter, o shell tentará executar a primeira parte como um comando. (Basicamente, o primeiro grupo de personagens até o primeiro espaço em branco.)

Não há nenhum comando ou arquivo executável chamado ./., por isso ele falhará e informará que ./"é um diretório". Curiosamente, . é um comando (é um builtin também encontrado como source), então quando você apenas digitar .você vai ter: bash: .: filename argument required.

slhck
fonte
By the way, a maneira correta de verificar se existe um diretório étest -d /path/to/dir
Slhck
3

Como outros escreveram, ./é o nome do diretório atual. Quando você digitou ./no prompt bash e pressionou Enter, você tentou executar o diretório atual como um comando, que obviamente falhou, e o bash lhe deu a mensagem (parafraseada), "Eu não posso fazer isso. ./É um diretório e eu não pode executar diretórios como comandos. "

garyjohn
fonte
2

O .implica o diretório atual. Você usa ./como prefixo para qualquer arquivo no diretório atual.

Da mesma forma, ..implica no diretório anterior (superior). É freqüentemente usado quando se está indo para um diretório de nível mais alto, por exemplocd ../../../

Dado um sistema de arquivos com o conteúdo:

# Comments start with a hash and aren't parsed
/                    # root directory
/foo/                # first level directory
/foo/bar/            # second level directory
/foo/bar/baz         # third level directory
/foo/bar/baz/qux     # a file in the third level directory

Se você está no terceiro nível diretor (baz), e você corre ls, você verá qux. Se você executar ls ., obterá a mesma saída, assim como se você executar ls ./.

Se você está no terceiro nível diretor (baz), e você corre ls ..e ls ../ambos lhe dão baz. Ou seja, o conteúdo do diretório um nível acima.

Zymhan
fonte
1
Incorreto - o diretório atual nunca está no PATH. Caso contrário, isso seria um enorme problema de segurança.
slhck
Meu mal, você está certo. Então, por que você não tem que prefaciar o diretório depois cd com ./?
Zymhan
1
PATH só se aplica a executáveis. Quando você digita foo, o shell tenta encontrar um executável chamado fooem seu PATH e ele executará o primeiro fooencontrado. Se você entrar cd bar, baré simplesmente uma opção passada para cd, que por padrão procurar no diretório atual para possíveis diretórios cdpara.
Slhck
1

No Linux ./ significa o diretório atual (e ../ refere-se ao diretório pai).

Se você fizer um ls -a, você verá. e .. listados como diretórios (você precisa do -a porque. representa um diretório oculto)

davidgo
fonte