Diretório atual e caminhos absoluto e relativo no Bash

Curso de Bash

Seção do curso de Bash sobre diretório atual (pwd) e caminhos relativo e absoluto.

Uma sessão de Bash sempre estará associada à um diretório atual.

Quando o Bash é iniciado, geralmente estará associado ao diretório de usuário do usuário que iniciou a sessão.

Conteúdo

  1. Diretório atual
  2. O que é caminho?
  3. O que é caminho absoluto?
  4. E o que é caminho relativo?
  5. Como mudar o diretório atual?
  6. Exercícios

Diretório atual

Diretório atual ou diretório de trabalho é o diretório ao qual Bash está associado no momento.

O diretório atual pode ser mudado porém sempre haverá um diretório atual.

Para determinar o diretório atual, o comando embutido pwd pode ser executado.

pwd
/home/caio

A saída de pwd exibe o caminho absoluto do diretório atual.

Diretório atual como .

O diretório atual também pode ser representado como . em argumentos de comandos.

Considerando a saída anterior de pwd, . é equivalente à /home/caio.

Portanto o comando abaixo produz a mesma saída que ls /home/caio.

ls .
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos

Nessa forma . o diretório atual poderá formar caminhos relativos.

Diretório atual no prompt

Outra forma de identificar o diretório atual, embora não tão consistente, é verificar o prompt.

caio@FX505DV:~$

~ é o caractere que representa o diretório de usuário para o usuário caio.

No caso acima, ~ representa o diretório /home/caio porém o diretório de usuário pode variar bem como o formato do prompt.

O que é caminho?

Caminho é a localização única de um arquivo ou diretório em um sistema de arquivos.

O sistema de arquivos no Linux é hierárquico, o que significa que um diretório pode estar acima de outro diretório ou acima de um arquivo.

Abaixo o diretório Music está sob o diretório caio, que por sua vez está sob home, e acima de home está o diretório raiz /.

/home/caio/Music

Um diretório acima de um diretório ou arquivo é chamado de diretório pai.

Arquivos sempre são representados no fim de um caminho já que um arquivo não pode estar acima de outro arquivo ou diretório.

/home/caio/meu_arquivo.txt

O que é caminho absoluto?

Caminho absoluto é o caminho completo para um arquivo ou diretório.

Na saída de pwd obtivémos o caminho absoluto /home/caio.

  1. / é o diretório raiz.
    • É sempre o primeiro diretório no Linux, portanto todos os caminhos absolutos começam com /.
    • Todos os diretórios e arquivos estão sob o diretório raiz, direta ou indiretamente.
  2. home é o diretório diretamente sob /.
    • A barra em home/ é um separador, necessário quando o diretório é seguido por um arquivo ou diretório e opcional quando não seguido.
  3. caio é o diretório diretamente sob home e indiretamente sob /. Último diretório no caminho.

Utilizando caminho absoluto podemos nos referir a qualquer arquivo/diretório independentemente do diretório atual.

Abaixo ls lista diretórios/arquivos no diretório raiz.

ls /
bin  boot  cdrom  core  dev  etc  home  lib  lib64  libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  swapfile  sys  tmp  usr  var

Da saída acima, podemos listar os conteúdos do diretório boot, ou qualquer outro diretório, utilizando seu caminho absoluto.

Como boot está diretamente sob o diretório raiz, basta anteceder boot com /.

ls /boot
config-5.4.0-51-generic  grub                         initrd.img-5.4.0-52-generic  memtest86+.elf               System.map-5.4.0-52-generic  vmlinuz-5.4.0-52-generic
config-5.4.0-52-generic  initrd.img                   initrd.img.old               memtest86+_multiboot.bin     vmlinuz                      vmlinuz.old
efi                      initrd.img-5.4.0-51-generic  memtest86+.bin               System.map-5.4.0-51-generic  vmlinuz-5.4.0-51-generic

Para listarmos o conteúdo do diretório grub, inclua / para separá-lo de boot.

ls /boot/grub
fonts  gfxblacklist.txt  grub.cfg  grubenv  unicode.pf2  x86_64-efi

E o que é caminho relativo?

Caminho relativo é o caminho relativo ao diretório atual para chegar em um arquivo ou diretório.

Considerando ainda a saída do pwd /home/caio.

Para listarmos o conteúdo do diretório Music poderíamos utilizar seu caminho absoluto.

ls /home/caio/Music
'Daft Punk'   Metallica   MGMT   Slayer

Porém, utilizando caminho relativo, poderíamos simplesmente especificar Music, já que Music está sob o diretório atual.

ls Music
'Daft Punk'   Metallica   MGMT   Slayer

Da mesma forma poderíamos acessar o diretório Metallica de forma relativa ao diretório atual ao invés do caminho absoluto /home/caio/Music/Metallica.

ls Music/Metallica
'Metallica - Fade to Black.ogg'  'Metallica - Master of Puppets.ogg'  'Metallica - Seek and Destroy.ogg'

Como referir aos diretórios acima do diretório atual?

.. é a representação de diretório pai.

Dado o diretório atual /home/caio, .. será resolvido como /home.

ls ..
caio  outro_usuario  lost+found

Para acessarmos mais níveis acima basta repetir .. para cada nível, os separando com /.

Abaixo ls recebe o argumento /, já que o diretório raiz está dois níveis acima de /home/caio.

ls ../..
bin  boot  cdrom  core  dev  etc  home  lib  lib64  libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  swapfile  sys  tmp  usr  var

.. pode ser utilizado em qualquer posição de um caminho.

Abaixo ../.. mudaria do diretório atual /home/caio para o diretório raiz (/), depois para /boot/grub e por conta dos .. finais o caminho resultaria em /boot.

ls ../../boot/grub/..
config-5.4.0-51-generic  grub                         initrd.img-5.4.0-52-generic  memtest86+.elf               System.map-5.4.0-52-generic  vmlinuz-5.4.0-52-generic
config-5.4.0-52-generic  initrd.img                   initrd.img.old               memtest86+_multiboot.bin     vmlinuz                      vmlinuz.old
efi                      initrd.img-5.4.0-51-generic  memtest86+.bin               System.map-5.4.0-51-generic  vmlinuz-5.4.0-51-generic```

Uma vez que .. atinja o diretório raiz, os .. subsequentes continuarão a resolver o caminho como \.

ls ../../../../..
bin  boot  cdrom  core  dev  etc  home  lib  lib64  libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  swapfile  sys  tmp  usr  var

. em caminhos relativos

Embora muitas vezes redundante, . pode fazer parte do caminho relativo em argumentos.

ls ./Musica equivale à ls Musica, bem como ls ./.. à ls ...

Resolvendo caminhos relativos com realpath

O comando realpath pode ser utilizado para resolver um caminho absoluto recebendo como argumento um caminho relativo.

A resolução de caminho é baseada no diretório atual.

O diretório abaixo é resolvido tomando como base o diretório atual /home/caio, e então subindo um nível na hierarquia de diretórios para /home.

realpath ./..
/home

⚠️ Tenha cautela já que realpath não verifica se o último arquivo/diretório no caminho absoluto resultante efetivamente existe.

Abaixo realpath resolve .. como /home já que o diretório atual é /home/caio.

realpath ../home
/home/home

Contudo /home/home não existe.

ls /home/home
ls: cannot access '/home/home': No such file or directory

Como mudar o diretório atual?

cd é o comando embutido para mudar o diretório atual para o diretório informado em seu argumento.

Abaixo, o diretório atual será mudado de /home/caio para seu diretório pai /home.

cd ..
pwd
/home

O diretório atual /home é mudado para caio/Music/MGMT utilizando-se caminho relativo.

cd caio/Music/MGMT
pwd
/home/caio/Music/MGMT

Sem argumento, cd muda o diretório atual para o diretório de usuário.

cd
pwd
/home/caio

- como argumento, muda o diretório atual para o diretório atual anterior.

cd -
pwd
/home/caio/Music/MGMT

❌ Caso cd não tenha sido utilizado nessa sessão, o seguinte erro é exibido para cd -.

bash: cd: OLDPWD not set

Exercícios

Selecione as afirmações corretas:

Dado o diretório atual /home/caio/Music/MGMT
Dado o diretório atual /home
Dado o diretório atual /home/user
Dado o diretório atual /home/user/Music
Escrito por Caio Santesso.

Comentários

  • Conteúdo dos posts, exceto onde indicado contrário, licenciado sob a licença CC BY-SA 4.0 .