Uma das primeiras formas de se comunicar com computadores foi através de texto. Estes primeiros terminais eram conectados a impressoras de telégrafo (teletipos) que imprimiam em papel o que lhes era pedido. Até hoje pode-se encontrar resquício disso, o termo tty é uma abreviação para teletipo (teletype em inglês) que também é um nome para terminal.
Mais tarde, monitores com a tecnologia de tubos de raios catódicos (CRT) foram conectados a computadores. A transição foi simplesmente trocar o papel pela tela. Ao invés de imprimir em tinta, imprimia-se no monitor. As vantagens mais óbvias estavam na economia de papel e velocidade em que a informação era impressa na tela.
Como a programação consiste em escrever textos para serem interpretados por computadores, essa interface de comandos, há tanto tempo criada, ainda se mostra bastante prática.
A camada responsável por interpretar os comandos do usuário para a máquina é chamada de shell (concha ou casca). O shell encobre a camada mais baixa de um sistema operacional, o seu kernel, escondendo suas complexidades e dos detalhes técnicos de sua interface.
Existem várias implementações diferentes de shells, a mais antiga era chamada somente de shell foi distribuido no Unix de 1971 a 1975. Porém este shell foi completamente reescrito por Setephen Bourne e distribuido a partir de 1979 no Unix, esta implementação é chamada de Bourne Shell.
Atualmente existem diversos shells, o mais comum sendo o bash
ou Bourne Again Shell que é uma brincadeira com o termo Born again ("nascido de novo" em inglês).
A linguagem de comandos bash
está presente na maioria dos sistemas operacionais descendentes ou inspirados no Unix como shell.
O macOS X e diversas distribuições Linux são exemplos desses sistemas.
Então é pelo bash
que temos uma interface de comunicação com o computador, através de comandos implementados neste shell podemos interagir com a máquina.
Todo comando é um programa que pode ser chamado pelo bash
.
Estes comandos ficam instalados em locais especificos do sistema em que o bash
está configurado para buscar.
A maioria destes comandos terão nomes extremamente curtos para serem rápidos de digitar.
O comando ls
lista o conteúdo do diretório.
Se você acabou de abrir o seu emulador de terminal, provavelmente o que lhe será apresentado como reposta é o conteúdo de seu diretório home.
Para visualizar uma lista do que temos no diretório basta digitar ls
e apertar ↵
(Enter):
Este diretório que é seu "lar" (home) é representado também como til (~
).
O motivo para isto é histórico, os teclados dos anos 70 (ADM-3A) para se digitar o til utilizava-se a tecla home.
Diretórios (ou pastas) no Linux e nos Unix são bastante diferentes do Windows.
Por exemplo, quando um pendrive é conectado ele não vai aparecer como um novo disco, não existe sequer um C:\
.
Pode-se parecer desnecessário e confusa a complexidade da estrutura de diretórios dos Linux e Unix,
porém essa mesma complexidade permite uma maleabilidade enorme destes sistemas quando se trata de gerenciamento de discos e arquivos.
A estrutura de diretórios nos Linux e Unix consiste em um diretório raíz (em inglês: root) que é onde todos os outros diretórios e arquivos podem ser criados.
O diretório raís é referenciado por uma barra (/
) e a partir dele é possível chegar a qualquer arquivo ou outro diretório dentro do sistema.
O diretório home que é representado pelo ~
(til) encontra-se pelo caminho /home/
e tem o nome de seu usuário, que seria por exemplo /home/emperor/
para um usuario nomeado emperor,
Para o usuário emperor, o ~
referencia este diretório.
Estes são caminhos "absolutos", tem essa denominação pelo motivo de que estes caminhos indicam como chegar a um diretório (ou arquivo) a partir da raís do sistema.
Isso porque este caminho (ou path, em inglês) inicia com /
, sem qualquer palavra antes desta barra, a única referencia que se pode assumir é que esta é a referencia à raís.
Um caminho como Documents/arquivo_de_texto.txt
é chamado de caminho "relativo" por não apresentar o "trajeto" inteiro desde a raís do sistema, dessa forma este caminho será relativo à algum outro local.
Caminhos relativos fazem sentido por exemplo quando você quer abrir um diretório ou arquivo logo onde você está, sem ter que referenciar todo o caminho novamente a partir da raís.
Existem mais dois pontos a serem abordados sobre caminhos relativos:
- o
.
(ponto); - e o
..
(ponto duplo, ou ponto-ponto).
O .
é uma referência ao diretório atual, considerando que você esteja em /home/emperor/Documents/
, o .
é uma referência para este diretório.
Enquanto o ..
é uma referência ao diretório "pai" (ou parent), o diretório que contém o diretório atual, neste caso seria o /home/emperor/
.
Todo diretório possui uma referência a ele mesmo (.
) e ao seu parent (..
), no caso do diretório /
, seu parent é ele mesmo.
O .
é muito utilizado em casos que queremos executar algum arquivo que está logo no diretório que estamos:
Neste exemplo, existe um arquivo executável chamado asciiquarium
no diretório que estamos e para poder executá-lo, precisamos informar que estamos executando algo do diretório atual.
Isso acontece por questões de segurança, executar alguma coisa sempre envolve algum risco e esta característica traz clareza a o que o usuário está querendo executar.
É uma sigla para print the working directory, ou seja, mostre o diretório em que estou trabalhando no momento.
O output (ou resposta) do pwd
então é o path (caminho) "absoluto" de onde executamos este comando.
Ou também chamados de argumentos, são valores informados à direita de algum comando. estes parâmetros são repassados para o comando que tem então seu comportamento alterado.
O uso de parâmetros é bastante intuitivo,
cada palavra ou número separada por um ou mais espaços em branco (
) será considerada um parâmetro diferente.
Existem outros caracteres que tem uma importância especial para o bash
, que vai além do seu significado literal.
Portanto são tratados de uma forma diferenciada e não são repassados como parâmetros.
Para ver a lista completa destes caracteres, veja a sessão de caracteres especiais para o bash.
Nos casos onde algum destes caracteres deveria fazer parte do parâmetro que você quer passar, a solução é simples:
basta colocar o parâmetro todo entre aspas simples ('
), exemplo:
echo 'Olá mundo!'
Outra forma de fazer o mesmo é utilizando a barra invertida (\
) antes do caractere que deveria ser ignorado por esse tratamento especial do bash
e só repassada adiante.
Exemplo:
echo Olá\ mundo\!
Neste exemplo, o espaço logo após a palavra Olá
está sendo ignorado pelo interpretador bash
e simplesmente entendido como parte do parâmetro, da mesma forma que o ponto de exclamação.
Por causa deste comportamento, a barra invertida também é chamada de caractere de escape.
Para navegar por estes diretórios existe o comando cd
(change directory).
Ele aceita um parâmetro, o diretório para o qual você pretende ir.
Por exemplo, para navegar até o diretório raíz, basta digitar o exemplo abaixo e apertar ↵
(Enter) ao final:
cd /
Caso não informado qualquer parâmetro para o comando cd
o que irá acontecer é que o comando irá assumir o valor padrão e nos levará para o diretório home.
Isso porquê o valor padrão para o parâmetro deste comando é o seu home. Exemplo:
cd
Dessa forma, executar cd
sem passar um diretório é a mesma coisa que usar a referência ~
ao home como parâmetro:
cd ~
A forma fácil de se navegar para o direito "pai" do atual é usando a referência ..
vista anteriormente, exemplo:
cd ..
Uma outra referência que o cd
oferece para facilitar é o -
(sinal de menos),
usa-lo como parâmetro serve para voltar ao diretório que se estava antes da última execução do cd
:
cd -
O "segredo" para ganhar agilidade na digitação na interface de comandos do bash
é o autocomplete ativado pela tecla Tab
.
Este é um recurso bastante inteligente que nos poupa digitação.
Quando se está digitando qualquer coisa e preciona-se o Tab
, é feita uma busca por todos os possíveis valores para a palavra que está sendo digitada.
Caso só exista uma opção, a palavra é completada automaticamente com um espaço ao final para continuar a digitar outras coisas.
Caso existam mais opções, somente será auto-completada a palavra até o ponto em comum com as outras opções:
Caso esteja digitando algo e o autocomplete não completar nada é porque já existe mais de uma opção para o próximo caracter.
Apertar mais uma vez o Tab
nesta situação resulta em uma lista dos possíveis valores para o que se está sendo digitado.
Caso a lista de valores possíveis seja grande, o bash
irá perguntar se tem certeza que deseja listar todas as opções.
Uma característica interessante dos sistemas operacionais Linux e Unix é que estes não dependem de extensões (ex: .jpg
, .pdf
, .doc
, etc.) dos arquivos para determinar o seu tipo.
O que acontece é que existem outras formas de se determinar o tipo de um arquivo, o uso de extensões que foi popularizado pelo Windows não é a única forma.
Outras formas de se fazer isso é com base no início do conteúdo de o arquivo buscando por uma assinatura (file signatures - em inglês), ou buscando pelo MIME Type.
O comando file
serve para identificarmos o tipo de um arquivo. Este comando recebe um parâmetro, que é o nome do arquivo que deseja-se identificar.
Caso pergunte por um diretório, a resposta será simplesmente file-system: directory
.
updatedb
-
atualiza a data de edição de um arquivo
-
caso não exista o arquivo requisitado, cria o arquivo vazio