Tudo bem, pessoal, obrigado por virem.
Esse é o semestre que faltava na sua fomação em ciência da computação.
Ou, pelo menos, é assim que decidimos nomear
este curso. Se não é pra essa aula que
você veio, então você entrou na sala errada. Nós
estaremos aqui por mais ou menos 1h só
para ajustar suas expectativas e... eu quero falar
um pouco com vocês sobre o por quê
de estarmos dando este curso. O curso
se originou de uma observação que o Anish,
o José e eu fizemos enquanto dávamos monitoria para vários
cursos no MIT. Basicamente,
todos nós, cientistas da computação, sabemos
que computadores são ótimos em fazer
tarefas repetitivas e automatizar coisas.
Mas muitas vezes não percebemos que há
muitas ferramentas que podem fazer nossos próprios
processos de desenvolvimento melhores. Nós podemos ser
bem mais eficientes sobre como usamos nossos
computadores porque podemos usá-los
como uma ferramenta para nós mesmos, não
apenas para criar websites ou software ou
coisas do gênero. Este curso é
uma tentativa de abordar isso e uma tentativa
de mostrar para vocês algumas ferramentas que vocês
podem usar para um ótimo efeito seu dia a dia
em pesquisa e nos estudos.
Este vai ser um curso no qual nós
queremos ensinar tanto como aproveitar
ao máximo as ferramentas que você já
conhece, mas também, assim esperamos, ensinar vocês sobre
algumas ferramentas novas,
além de como combinar essas ferramentas
para produzir coisas mais poderosas do que
vocês imaginam ser capaz de fazer com o que
já sabem atualmente. Este curso está
estruturado em uma séria de aulas de 1h
e cada aula vai cobrir
um tópico em paticular. Vocês podem checar
o website, que está escrito lá, para
acessar a lista de tópicos e datas
de cada um. As aulas serão, em geral,
independentes, então vocês podem
comparecer às que lhes interessa.
Porém vamos assumir que
vocês vêm acompanhando o conteúdo, de modo
que, ao chegarmos às aulas futuras, não
vou ficar ensinando bash tudo outra vez.
Por exemplo, nós também vamos postar
tanto as notas de aula quanto as gravações
das aulas online. Ainda não decidimos
exatamente quando vamos fazer isso,
mas será após as aulas. Obviamente, os
vídeos têm de ser postados depois que a aula ocorre.
O curso vai ser ministrado por mim, John e
Anish, sentados ali, e pelo Jose,
que não está aqui mas vai dar
a aula de amanhã. Lembrem-se que
estamos tentando abordar um monte
de assuntos neste curso de apenas 11
aulas de 1h, então vamos avançar
relativamente rápido. Mas, por favor,
interrompam se houver algo que vocês
não estiverem conseguindo acompanhar.
Se você achar que devemos dedicar
mais tempo a algum tópico, fale conosco.
Por favor, interrompa com perguntas.
Além disso, após cada aula estaremos
disponíveis no nono andar do
prédio 30 no Stata Center,
o prédio de ciência da computação. Então, se você
aparecer no nono andar
lá, na Gates Tower, pode vir
e tentar fazer os exercícios que
vamos dar em cada aula ou simplesmente fazer perguntas
sobre outras assuntos que tivermos
tratado nas aulas ou outras coisas,
como umar seu computador de forma eficiente.
Devido ao tempo limitado que temos
disponível, não vai ser possível
abordar todas as ferramentas em detalhe,
então tentaremos salientar ferramentas
importantes e formas interessantes de usá-las.
Não vamos, necessariamente, ir a fundo
nos detalhes de como tudo funciona or
discutir casos mais elaborados, mas se vocês tiverem
perguntas sobre isso, por favor, venha falar conosco
sobre isso também. Muitas dessas ferramentas são
ferramentas que temos usado por anos
e podemos lhes direcionar a mais coisas
interessantes que vocês podem fazer com elas.
Então, aproveitem que estamos aqui.
Esta aula vai... não quero dizer
escalar rapidamente, mas
o que vai acontecer no decorrer
dessa aula em particular é que vamos
abordar bastante do básico, e assumiremos
que vocês já sabem isso no restante do
semetre. Coisas como usar o
shell e o terminal (vou explicar o que são
para os que não conhecem ainda),
e depois, bem rapidamente, vamos
escalar para ferramentas mais avançadas
e como usá-las. Vocês já podem ver nas
notas de aula o tipo de
tópicos que vamos cobrir.
Então isso nos traz à aula de hoje
na qual vamos cobrir o shell.
O shell vai ser uma
das formas primárias de interagir com seu
computador. Quando você quiser fazer mais coisas
do que as que são possíveis com as interfaces visuais,
com as quais talvez você esteja acostumada/o, lhe permitam fazer.
As interfaces visuais são limitadas no
que
elas lhe permitem fazer, porque você só
pode fazer as coisas para as quais há
botões, sliders ou campos de inputs.
Geralmente essas ferramentas textuais são construídas
para serem combinadas umas com as outras, mas
há também diversas formas diferentes de
combiná-las, programá-las ou
automatizá-las e é por isso que,
neste curso, vamos focar na
linha de comando ou em ferramentas baseadas em texto.
O shell é o local se faz a
maioria desse trabalho. Então para aqueles que
não estão acostumados com o shell, a maioria
das plataformas oferecem algum tipo de shell.
No Windows, há o PowerShell, mas
há também outros shell disponíveis
no Windows. Já no Linux vocês vão encontrar um monte de
terminais, que são janelas que lhes permitem
visualizar shells e vocês também vão
encontrar diversos tipos de shells. O mais
comum deles é o bash, ou 'born
again shell'. Por ser um shell tão comum,
é basicamente esse que vamos
usar nessas aulas.
Se você usa Mac OS, você provavelmente
já tem o bash ou uma versão antiga dele
se você abrir o app do terminal. Então,
se você quiser acompanhar em qualquer uma
dessas plataformas, fique à vontade, mas
tenha em mente que o curso vai ser
meio que baseado em Linux no que diz respeito a como
vamos ensinar, ainda que a maioria dessas ferramentas
funcione em todas as plataformas. Se você quiser
instalar um terminal e um shell e
não sabe como fazer isso muito bem, ficaremos felizes em
lhes ajudar na nossa sala ou, geralmente,
é bem fácil buscar no Google
'sua plataforma' mais 'terminal' e você
vai achar um. Bom, quando você abre um
terminal você vê algo que se parece com
isso. Normalmente vai ter
uma única linha no topo, o que é
conhecido como prompt do shell.
Você pode ver que meu prompt do shell
parece com isso, tem meu nome de usuário, o nome
da máquina que estou usando, o caminho
da pasta onde estou (vamos falar de caminhos
um pouco mais tarde) e daí ele
fica piscando lá, pedindo
um input. Esse é o prompt do shell
onde você diz ao shell o que quer
que ele faça. Dá pra customizar
bastante esse prompt, quando você abri-lo
na sua máquina talvez ele não vai ter exatamente
essa aparência. Talvez um pouco,
se você já tiver configurado,
ou pode ter muitas outras
formas. Não vamos falar muito
sobre customizar seu shell nesta
aula em particular,
faremos isso mais tarde. Aqui vamos
só falar sobre como usar esse
shell para fazer coisas úteis. Esta é
a principal interface de texto que você
tem para seu computador, através do shell.
No shell, você pode digitar
comandos e os comandos podem ser
coisas relativamente simples. Geralmente
você vai executar programas com
argumentos. Como isso funciona? Bem,
um programa que podemos executar é o de data.
É só digitar date e apertar
enter, aí ele vai
te mostrar a data e hora. Você também
pode executar um programa com argumentos.
Isso é uma forma de modificar o comportamento
do programa. Por exemplo, há um
programa chamado echo. O echo imprime
os argumentos que você passa, e esses
arugmentos são simplesmente coisas
separadas por um espaço em branco logo após o nome.
Então podemos dizer hello e ele vai imprimir
hello de volta.
Talvez não muito surpreendente, mas isso
é uma das coisas básicas dos argumentos.
Uma coisa que vocês vão notar é que eu disse
que argumentos são separados por
espaços em branco. Talveu vocês se perguntem, "bom,
e se eu quiser um argumento com várias
palavras?" Você pode pôr essas coisas entre aspas, e aí dá para
fazer coisas como echo hello espaço
world e agora o programa echo recebe
um argumento que contém a string
hello world com um espaço. Bom, também dá
para usar aspas simples para isso. Vou explicar a
diferença entre aspas simples e
aspas duplas quando falarmos
sobre scripting em bash. Vocês também
podem escapar um caracter, então, por
exemplo, hello world. Isso também
funciona. Todas as regras sobre
como escapar e como analisar e
dar vários argumentos e variáveis
nós vamos cobrir mais tarde. Espero
que não encontrem muitas coisas esquisitas sobre isso. Nós temos de
provocar vocês sobre isso. Lembrem-se pelo
menos que argumentos são separados por espaços, então,
se você quiser fazer algo como criar um
diretório chamado "my photos",
não dá para simplesmente digitar make directory my photos.
Assim ele vai criar dois diretórios,
um chamado my e outro chamado photos e
provavelmente não é isso que você quer.
Uma coisa que você pode se perguntar é como o
shell sabe o que são esses programas quando
eu digito date ou echo. Como ele
sabe o que esses programas devem
fazer. A resposta é que o seu
programa, seu
computador tem um monte de programas
embutidos que já vêm com a máquina.
Assim como seu computador pode vir com o
aplicativo do terminal, ou com
o Windows Explorer ou
com algum tipo de navegador, ele também
já vem com aplicações específicas para
o terminal, e elas ficam salvas no
seu sistema de arquivos e o shell tem
uma maneira de determinar onde um programa está
localizado. Basicamente, ele tem uma forma de buscar
por programas. Ele faz isso através de
algo chamado variável de ambiente
invariante. Uma variável de ambiente
é uma variável que pode ser
usada para linguagens de programação.
Na verdade, o shell e o bash
em particular é
uma linguagem de programação. Esse
prompt que aparece aqui
é capaz não somente de rodar um programa
com argumentos. Ele também pode fazer outras coisas como
while loops, for loops, condicionais...
Tudo isso. Você pode definir
funções, pode ter variáveis, todas essas
coisas você consegue fazer no shell.
Vamos abordar boa parte disso na próxima
aula sobre shell scripting. Mas, por ora,
vamos olhar para
essa variável de ambiente em particular.
Variáveis de ambiente são coisas que
estão definidas toda vez que você inicia o shell.
Vocês não precisam defini-las toda vez
que abrem o shell, há
várias delas que já estão definidas, como
onde fica seu diretório home, qual
é seu nome de usuário. Há uma que é essencial
para esse caso em particular
que é a variável de caminho. Então se
eu digitar echo $PATH, ele vai
me mostrar todos os caminhos na minha máquina
onde o shell vai buscar por programas.
Vocês vão notar que isso é uma lista
separada por dois pontos. Ela pode ser
um pouco longa e difícil de ler, mas o importante
é que, sempre que você digitar o nome de
um programa, o shell vai buscar nesta
lista de caminhos da sua máquina, olhando
em cada diretório em busca de um
programa ou arquivo cujo nome coincida
com o comando que você está tentando rodar. No meu caso,
quando tento rodar date ou echo, ele
vai rodar por essa lista um por vez
até achar um que contenha o
programa chamado date ou echo, e aí
ele vai rodá-lo. Se quisermos saber
qual exatamente ele roda, há um
comando chamado which. O which nos permite
fazer isso, então quando eu posso digitar which echo e ele
vai me dizer que, se eu quiser rodar um programa
chamado echo, ele iria rodar deste aqui.
Vale a pena pausar aqui e falar sobre o
que são caminhos. Caminhos são uma forma nomear a
localização de um arquivo em seu computador.
No Linux e no MacOS esses caminhos são
separados por /, então
você vai ver aqui que este está no
diretório root. O / logo no começo
indica que o caminho começa
no topo do sistema de arquivos.
Depois olha no diretório chamado
usr, depois no diretório chamado bin
e depois olha no arquivo chamado echo.
No Windows, caminhos como esse são geralmente
separados por \.
Quando estamos no Linux ou MacOS,
tudo mora no root, então
todos os caminhos começam com um /, ou melhor, todos os
caminhos absolutos. No Windows, há um root
cada cada partição. Vocês já devem ter
visto coisas como C:\ ou D:\ .
No Windows, há um tipo de hierarquia
de caminhos de sistema para cada drive
que você tem,
enquanto no Linux e no MacOS
fica tudo sob um único nome.
Vocês devem ter notado que eu mencionei
caminho absoluto e talvez saibam o que isso
significa. Caminhos absolutos são caminhos
que determinam por completo a localização de um arquivo.
Neste caso, isso quer dizer que
queremos nos referir a um arquivo específico chamado echo
e estamos dando o caminho completo até
esse arquivo. Mas também há outro tipo
conhecido como caminhos relativos. Um
caminho relativo se refere a onde estamos no momento.
Então a forma de saber onde estamos no
momento é digitando pwd que significa
"imprima o diretório atual".
Então, se eu digitar pwd, ele
vai mostrar o caminho atual onde estou
agora, ou seja, estou no diretório
home sob o diretório root e depois
john, depois dev e assim por diante.
Daqui eu posso então decidir mudar
meu diretório atual, e todos os
caminhos relativos são ligados ao
diretório atual, que é
basicamente onde estamos no momento.
Por exemplo, neste caso, eu posso digitar
cd \home. cd quer dizer "mudar de diretório".
Essa é uma forma de mudar meu diretório
atual. Neste caso, eu mudei
para o home e vocês vêem que
o prompt do shell mudou, agora dizendo
que estou no home. Ele simplesmente mostra
o nome do último segmento do caminho,
mas vocês também podem configurar o terminal para mostrar
o caminho completo onde quer que
vocês estejam. Agora se eu digitar pwd de novo, ele
vai me dizer que estou no /home. Há alguns
diretórios especiais
aqui. Há o . e o .. . O .
se refere ao diretório atual e o ..
se refere ao diretório acima. Essa é uma
forma de navegar facilmente pelo
sistema. Por exemplo, se eu digitar cd ..
ele vai me dizer que estou agora no /,
ou seja, no root do sistema de
arquivos. Eu estava no /home e agora estou
no /. De fato, se eu digitar pwd, ele mostra
exatamente isso. Também posso usar
caminhos relativos para descer um nível no
caminho de arquivos. Então, se eu der cd . /home
ele vai me mover para o
diretório home sob o diretório atual.
E isso me leva
de volta ao /home. Se eu tentar agora cd ./home
de novo, ele me avisa que não há nenhum
diretório com esse nome porque não há um
diretório home sob o diretório em que
estou agora, no qual entrei com o cd.
Eu consigo usar cd para voltar todo o caminho
que percorri, usando
caminhos relativos, e eu posso fazer outras coisas
como ../../../../jon/ para voltar
para algum lugar lá dentro do meu sistema de arquivos.
Ocorre que ele está lá no root.
Aqui temos o diretório bin, e nele
há o arquivo echo. Daí eu
posso dar world e ele roda o
programa echo que está no bin.
Essa é uma forma com a qual vocês podem construir caminhos para
atravessar arbitrariamente seu sistema de arquivos.
Às vezes vocês vão querer usar caminhos absolutos e
às vezes, relativos. Geralmente
vocês vão querer usar o que for mais curto
mas se vocês quiserem, por exemplo, rodar
um programa ou escrever
um programa que roda esse programa, como
echo ou date, e vocês querem poder
rodá-lo a partir de qualquer local, ou
vocês dão o nome do
programa, como date ou echo, e deixam o
shell usar o caminho para descobrir onde
ele está, ou vocês dão o caminho
absoluto, porque se vocês derem um caminho relativo,
e eu for lá e rodar no meu diretório home,
e vocês rodarem em um outro diretório,
pode ser que funcione para mim mas não para vocês.
Em geral, quando rodamos um programa, ele
vai operar no diretório
atual, ao menos esse é o padrão,
a não ser que passemos outros argumentos.
Isso é bem útil porque significa
que muitas vezes não temos de dar
o caminho completo para as coisas, podemos simplesmente
usar o nome dos arquivos no diretório
em que estamos. Uma coisa
bem útil é descobrir em que diretório
estamos. Nós já
vimos o pwd que imprime o local
onde estamos, e há um comando chamado
ls que vai listar os
arquivos no diretório atual. Então se eu
digitar ls aqui, vemos todos os arquivos
no diretório atual, certo? É uma forma
boa de rapidamente navegar
através do sistema de arquivos. Vocês vão
ver que se eu der cd .. e depois ls, ele
me mostra os arquivos naquele diretório,
mas com o ls eu posso dar
ls .. e um caminho e
aí ele lista o que tiver naquele aquivo em
vez do que o que estou agora. Ele lista o outro
diretório. E vocês podem ver que se eu
for até o root também, certo, o root
tem outros arquivos. Um truque legal
que talvez vocês não conheçam aqui: há
dois outras coisas especiais que você pode fazer.
Uma é usar o til. Esse
caractere te leva pro diretório
home. Então o til sempre se expande para
o diretório home e você pode usar
caminhos relativos a ele. Posso dar til / dev
/pdos/classes/missing-semester/ e
agora estou lá porque esse til se expandiu
para /home/john. Um outro argumento legal
que vocês podem dar para o cd especificamente
é, se vocêm derem cd -,
ele vai cd para o diretório onde você
estava antes. Se eu der cd -, volto
para o root.
Se der cd - de novo, volto para o missing-semester.
É uma maneira útil de ficar indo e vindo
entre dois diretórios diferentes.
Em caso do ls, ou em caso
do cd, pode haver argumentos que vocês
não conhecem, certo? Até agora, ainda não
fizemos muito mais do que
dar caminhos, mas como é que descobrimos
que é possível passar um caminho para o ls
pra começo de conversa? Bem, a maioria
dos programas aceitam o que chamamos de argumentos, como
flags e opções. Essas são coisas que
geralmente são precedidas por um -. Um dos
usos mais úteis é --help. Muitos programas
implementam esse, então se vocês rodarem,
por exemplo, ls -help, ele proveitosamente
imprime um monte de informações sobre
aquele comando. Vocêm podem ver que ele
dize que o uso é ls e que é possível dar
um número de opções, e um número de
arquivos. A forma de se ler essa linha é
três pontos significa zero ou um
ou mais e os colchetes
querem dizer opcional. Nesse caso,
há um número opcional de opções
e um número opcional de arquivos.
Vejam que ele explica o que o programa
faz e também especifica um número
de diferentes tipos de flags e opções
que podemos escolher. Geralmente chamamos essas coisas
com um - e uma única letra
de flag ou qualquer coisa que
não leva um valor de flag, e qualquer
coisa que leva um valor chamamos de opção. Então,
por exemplo, - a and - all são ambos flags
e -C ou --color é uma opção. Uma coisa
que vocês vão ver se descerem bastante a
tela é a flag -l. Ops.
A flag -l usa
o formato de lista longa. Isso é
especialmente útil por si só,
mas vamos ver o que ela faz.
Se eu der ls -l, ele imprime
os arquivos no diretório atual, mas ele
dá muito mais informação sobre esses
arquivos. Vocês vão ver que vão usar
bastante isso porque
essas informações adicionais que ele
mostra são geralmente bem úteis. Vamos
ver um pouco dessas informações.
Primeiramente, o d no começo
de alguns desses itens
indica que aquele item é um diretório.
Então o _data aqui, por exemplo,
é um diretório,
enquanto o html não é um diretório,
mas sim um arquivo. As letras seguintes
indicam as permissões que estão
definidas para este arquivo. Então, como
vimos antes, talvez eu não consiga abrir
um certo arquivo ou não consiga
entrar em um diretório. Tudo isso é
regido pelas permissões daquele arquivo
ou diretório em particular. A maneira de
interpretar isso é: o primeiro dos três
grupos são as permissões definidas para o
dono do arquivo. Todos esses arquivos
que estamos vendo têm eu dono como.
O segundo grupo de três caraceteres se refere
às permissões do grupo que é dono desse
arquivo. Neste caso, todos esses arquivos
também pertencem ao grupo john.
Já o último grupo de três é uma lista
das permissões para todo o restante, ou seja,
qualquer um que não seja nem dono nem membro do grupo.
Esse diretório está um pouco sem graça
porque eu sou o dono de todos os itens,
mas se dermos cd /
ls -l vocês vão ver que
aqui todos os arquivos pertencem ao root.
Vamos voltar para esse assunto do usuário root, só vejam
que aqui as permissões são
um pouco mais interessantes. Os grupos de
três significam leitura, escrita e execução.
Isso signifca coisas diferentes para arquivos e para
diretórios. Para arquivos, é bem simples:
se vocês tiverem permissão de leitura para
um arquivo, vocês conseguem ler seu
conteído. Se tiver permissão de escrita
para um arquivo, podem salvá-lo
e adicionar conteúdo a ele, ou até
substitui-lo completamente. E se você
tiver x na execução de um arquivo,
você pode executá-lo. Então,
se dermos ls -l /usr/bin,
vocês verão que todos
têm a permissão de execução ativada
para todas as pessoas que não forem donas
do arquivo. É assim porque o programa
echo, por exemplo, queremos que possa
ser executado por qualquer um usando o computador.
Não há motivo pra dizer que apenas
alguns usuários podem rodar o echo.
Isso não faz sentido.
Já para diretórios, essas permissões
são um pouco diferentes. Leitura
quer dizer que podemos olhar quais
arquivos existem dentro desse diretório.
Associem leitura como list para diretórios.
Estamos autorizados a listar seu conteúdo?
Escrita para um diretório diz se estamos
autorizados a renomear, criar ou remover
arquivos dentro dele. Faz sentido,
mas lembrem-se de que isso significa que,
se vocês têm permissão de escrita em um arquivo
mas não têm permissão de escrita no
diretório dele, vocês não podem deletar o arquivo.
Você pode esvaziá-lo, mas não deletá-lo,
porque para isso seria preciso escrever
no diretório em si. Finalmente, execução
em diretórios é algo que confunde bastante
as pessoas. Executar em um diretório
é o que se chama buscar. O nome
não ajuda muito, mas o que quer dizer é
que podemos acessar esse diretório se
quisermos chegar a um arquivo.
Se quisermos abri-lo, lê-lo ou
escrever nele, ou qualquer outra coisa,
para dar cd e entrar em um diretório
é preciso ter permissão de execução em
todos os diretórios acima dele e
no próprio diretório. Por exemplo,
para eu acessar um arquivo dentro de
/usr/bin como o /usr/bin/echo, preciso
ter permissão de execução no root,
no usr, no
bin. Se eu não tiver algum deles,
não terei permissão
de acessar aquele arquivo, porque
não terei acesso aos diretórios ao longo do caminho até ele.
Vocês podem encontrar outros bits,
por exemplo, vocês podem ver
s ou t nessas listas, ou l.
Podemos conversar no tira-dúvidas
se ficarem curiosos,
a maioria não importa muito para
os assuntos que vocês vão ver neste curso,
mas é legal conhecer. Então, se quiserem
saber mais sobre eles, pesquisem
ou venham falar conosco.
Há outros programas que é bom
conhecer. Desculpa, uma coisa mais.
Como eu mencionei, se vocês só verem um -
significa que vocês não têm aquela
respectiva permissão. Por exemplo, se
houver r-x, quer dizer que vocês podem
ler e executar, mas não ler.
Há outros programas úteis
para vermos agora.
Um deles é o comando move ou mv.
Se eu der cd de volta para missing-semester, aqui o mv
me permite renomear um arquivo usando
dois caminhos, o caminho antigo e o
caminho novo. Ou seja, move nos permite
tanto renomear um arquivo, como quando
mudamos o nome do arquivo mas não o
diretório, ou ele permite mover
um arquivo para um diretório diferente.
É só dar o caminho atual do arquivo
e o caminho para onde vocês querem movê-lo
e isso vai alterar sua localização e
seu nome. Por exemplo, eu posso mover
dotfiles.md para foo.md
e, da mesma forma, posso mover
de volta. Há também o comando cp.
O cp ou copy é bem parecido,
ele nos permite copiar um arquivo também
usando dois argumentos, o caminho de onde
queremos copiar e o caminho para onde
queremos copiar. Esses são caminhos completos, então eu poderia
usar isso, por exemplo, para dizer que quero
copiar dotfiles.md to ../foo.md.
E agora se eu der ls .
vocês podem ver que há um arquivo foo.md
naquele diretório. O cp também
recebe dois caminhos, não é preciso ser no
mesmo diretório. Igualmente existe o
comando rm que nos permite remover
um arquivo e também dá para dar caminhos.
Nesse caso, estou removendo ../foo.
Lembrem-se que o remover,
especialmente no Linux, por default
não é recursivo, então não dá para remover
um diretório usando rm. É preciso passar
a flag -r que nos permite
remover recursivamente e depois o
caminho que quer remover. Daí ele
remove tudo que estiver sob este diretório. Há também
o comando rmdir que permite
remover um diretório mas só se
ele estiver vazio. Então a
ideia aqui é criar um mecanismo pra
nos dar uma certa segurança, para não
jogarmos fora acidentalmente um monte
de arquivos. O último comandozinho
que é útil usar é o mkdir que
permite criar um novo diretório.
Como falamos antes, você não quer fazer
algo assim porque senão ele vai
criar dois diretórios, um chamado
my e outro chamado photos. Para criar
um diretório assim é preciso escapar
o character de
espaço ou usar aspas.
Quando vocês quiserem mais informação
sobre como qualquer comando
nessas plataformas funciona, há um
comando bem útil para isso, que
invoca o programa chamado man,
que significa manual pages. Este programa
pede como argumento o nome de outro programa
e retorna seu manual. Então, por exemplo,
podemos digitar man ls e isso vai mostrar
a página do manual do ls. Vocês vão ver
que, nesse caso do ls, o resultado é bem
parecido com o que vemos com ls -help,
porém é mais fácil navegar e
ler. Mais pro final da página vocês
encontram exemplos
sobre quem escreveu o programa,
onde encontrar mais informação e esse
tipo de coisa. Algo que pode causar confusão
às vezes,
ao menos até a versão mais atual em que
eles adicionaram essa árvore no final,
que diz q para sair, é que eles não costumavam
dizer isso, aperte q para sair deste
programa. Pode ser bem difícil de sair
pra quem não conhece. Falando nisso,
um atalho de teclado legal aqui é ctrl+l
que limpa o terminal e volta pro topo.
Até agora só falamos sobre
programas isolados, mas o
poder do shell, na verdade, aparece
na hora em que começamos
a combinar diferentes programas, certo?
Então, em vez de rodar cd e rodar ls etc,
vocês poderiam querer encadear
diversos programas, ou
querer interagir com arquivos e
operá-los entre um programa e outro.
A forma de fazer isso é usando a
noção de streams que o shell nos dá.
Todo programa, por default, tem...
vou simplificar um pouco e falar de
dois streams primários, o de entrada
e o de saída. Por default, o stream de
entrada é basicamente seu teclado,
seu terminal, e
o que quer que você digite no terminal vai
acabar parando no seu programa, que tem
um stream de saída padrão, que é
usado sempre que o programa imprime
algo. Ele imprime no stream e, por padrão,
é também seu terminal. É por isso que
quando digito echo hello, isso é impresso
no terminal. Mas o
shell lhes dá uma forma de redirecionar
esses streams para mudar onde é a entrada
e a saída de um programa.
A maneira mais fácil de fazer isso é
usando o < e >. De modo que vocês podem
escrever algo assim ou escrever algo
assim. O > significa que
a entrada pra esse programa deve ser
redirecionada para o conteúdo desse
arquivo e o < significa que
a saída do programa precedente deve ser
redirecionada para este arquivo. Vamos
ver um exemplo de como isso funciona.
Se eu der echo hello, posso dizer que quero que
o conteúdo seja salvo em
um arquivo chamado hello.txt. Como eu dei
esse caminho relativo, ele vai criar
um arquivo no diretório atual
chamado hello.text. Ao menos teoricamente
seu conteúdo deveria ser a
palavra hello. Se eu rodar isso, vejam
que nada aparece na minha saída, da
última vez que rodei echo hello
a palavra hello aparecia na tela.
Agora, essa saída foi direcionada para um
arquivo chamado hello.txt. Dá para verificar
isso usando um programa chamado cat.
O cat imprime na tela o conteúdo de um arquivo, então
posso rodar hello.txt e ele mostra
hello. Porém o cat também permite
esse tipo de direcionamento, então posso
dizer cat, que por default imprime sua
entrada na tela, ele apenas duplica a entrada
na saída. Posso dizer que quero que
pegue sua entrada do hello.txt, e o
que vai acontecer neste caso é que
o sheel vai abrir o hello.txt,
pegar seu conteúdo e definir isso como
a entrada do cat, e aí o car vai imprimir
isso na sua saída. Como não direcionei a saída,
vai aparecer no
meu terminal. Então ele vai simplesmente imprimir
hello na saída. Posso usar ambos
ao menos tempo, por exemplo,
se quero copiar um arquivo sem usar o
comando cp por algum motivo,
posso fazer assim. Neste caso, não
estou passando nada ao programa cat,
só estou dizendo, funcione normalmente,
o programa cat não sabe
nada sobre esse redirecionamento. Mas
estou dizendo ao shell para usar o hello.txt
como entrada para o cat e para escrever
o que quer que seja que o cat vai soltar no arquivo hello.txt.
De novo, nada aparece no meu terminal,
mas se
eu der cat hello2.txt, vejo a saída como
era esperado, que é uma cópia do arquivo
original. Há, também, o sinal >>
que significa anexar em vez de
escrever por cima. Então você vai notar
que se eu digitar
cat < hello.txt > hello2.txt
de novo e depois cat hello2.txt,
ele ainda contém somente hello, apesar de
já conter um hello antes. Se eu mudar para
>> para anexar
e digitar cat nesse arquivo,
agora hello aparece duas vezes. São
comandos bem simples, geralmente
só para interagir com arquivos, mas
isso fica realmente interessante se usarmos
um operador adicional do shell chamado
pipe. O pipe é uma barra vertical
e o que ele faz é pegar
a saída de um programa à esquerda e
torná-la entrada do programa
à direita. Vamos ver como funciona.
Vamos usar o exemplo do ls -l /
Isso imprime um monte de coisas. Digamos
que eu só quero a
última linha dessa saída. Bem, há um
comando chamado tail. O tail imprime
as últimas n linhas da entrada, então
posso digitar -n 1. Essa é a flag chamada
n. Também dá pra usar --lines se quiserem
uma opção mais longa, mas nesse caso
o que isso faz é imprimir a última
linha. Posso escrever tudo junto,
ls -l | tail -n 1.
Vejam aqui que o ls não sabe
nada sobre o tail e o tail não sabe nada
sobre o lr. São programas diferentes e que
nunca foram programados para ser compatíveis
um com o outro. Tudo que eles sabem
fazer é ler uma entrada e escrever em uma
saída. É o pipe que os conecta
e, nesse caso particular, estou dizendo
que quero que a saída do ls sirva de
entrada para o tail e quero que a saída
do tail vá para o terminal porque não
a redirecionei.
Eu também poderia definir que
a saída deveria ir para ls.txt e,
nesse caso, se eu der cat ls.txt vou
ver a saída apropriada. Ocorre que
é possível fazer coisas muito elegantes com isso.
Nós vamos ir mais a fundo na aula
'Duelando com os Dados' daqui
uns quatro dias, sobre as coisas
mais elaboradas que vocês podem fazer
ao construir pipelines mais avançados.
Pra dar um exemplo, podemos digitar
curl --head --silent google.com.
Só para mostrar como isso funciona,
esse comando retorna todos os cabeçalhos HTTP
para acessar google.com. E eu posso mandar
isso direto para o grep --ignore-case
ou -i se preferir, depois -content-lenght.
Isso vai imprimir o
tamanho do conteúdo do cabeçalho. O grep
é um programa sobre o qual vamos falar mais tarde.
Ele nos permite buscar uma palavra-chave
em um stream de entrada. Podemos usar o pipe para mandar
para o comando cut, que recebe um
delimitador, escolhido como espaço, e eu
quero o segundo campo. Isso imprime
apenas o tamanho do conteúdo. Esse é
um exemplo bobo, só para
extrair o tamanho em bytes
do google.com pela linha de comando.
Não é algo muito útil,
mas serve para mostrar que, encadeando
essas coisas, conseguimos obter
diversos efeitos de manipulação de texto.
E os pipes não servem apenas para
dados de texto, dá para usá-lo com
imagens também. Podemos ter um
programa que manipula uma imagem em
binário como entrada e escreve uma
imagem em binário como saída. E é possível encadeá-los
dessa forma (vamos dar mais exemplos
mais pra frente).
É possível usá-lo até com
vídeo se vocês quiserem.
Por exemplo, uma ótima maneira de
ter um chromecast em casa: você pode
stream um arquivo de vídeo ao definir
que o último programa no seu pipe é um
chromecast send. Com isso, dá para enviar
um arquivo de vídeo para o streaming ou
usar http para seu chromecast.
Vamos falar bem mais sobre isso na aula
'Duelando com os Dados'. Uma coisa mais
que gostaria de mostrar é como
usar o terminal de uma forma mais
interessante e talvez mais poderosa
do que vocês estão acostumados.
Essa dica talveu vai ser válida até para
quem já se sente mais
confortável com o terminal.
Primeiro precisamos abordar um tópico
importante no que diz respeito aos sistemas Linux
e MacOS em particular, que é a noção
de usuário root. O usuário root é como
o administrador no Windows,
ele tem ID 0.
O usuário root é especial porque ele
pode fazer o que quiser
no seu sistema, ainda que um arquivo não
possa ser lido ou escrito por mais
ninguém, o root ainda pode acessá-lo.
O root é como um super usuário
que faz o que quiser.
Na maiorias das vezes, vocês não vão
operar como o super usuário, vocês não
vão ser o root. Vocês vão ser um usuário como john
ou qualquer que seja seu nome, Esse vai
ser seu usuário, com o qual vocês agem,
porque se vocês operassem seu computador
como o usuário root o tempo todo,
e rodasse um programa errado, pode ser
que destruiriam o computador. Vocês não
querem fazer isso, certo? Mas de vez em quando
vocês podem querer fazer algo que requeira
que vocês sejam root. Para esses casos,
normalmente vocês vão usar um programa chamado sudo
or 'faça como su" e, nesse caso, su significa
super usuário. Essa é uma forma de fazer
algo como super usuário.
Normalmente funciona assim:
escrevemos sudo e depois o comando
como fazemos no terminal. Ele vai
rodar aquele comando como se você
fosse o root em vez do seu usuário normal.
Onde vocês podem precisar de algo assim?
Bem, um há vários arquivos de sistema
especiais no seu computador,
mas, em particular, há um
chamado sysfs. Se você der cd /sys,
vamos para um mundo bem diferente.
Esse arquivo de sistema não é exatamente
um arquivo em seu computador. Na verdade,
são vários parâmetros do kernel. O kernel
é basicamente o cérebro do seu computador.
Essa é uma forma de acessar os diversos
parâmetros do kernel através do que
se parece com um arquivo de sistema. Vejam
que se eu der cd em class, por exemplo,
há diretórios para um monte de tipos
diferentes de dispositivos com os quais
posso interagir, ou muitas filas que posso acessar
ou uma variedade de botões internos
esquisitos. Como eles estão mostrados como arquivos,
dá para usarmos todas as ferramentas que
já vimos para manipulá-los.
Um exemplo disso é se vocês entrarem
em sys class backlight, esse backlight
permite que configuremos diretamente
a luz do nosso laptop, se ele tiver uma.
Se eu der cd e entrar no intel backlight,
porque esse é um laptop da Intel,
aqui vocês vêem que há um arquivo chamado brightness
e eu posso cat brightness. Esse é o brilho
atual da minha tela. Mas mais que isso,
posso modificá-lo também para mudar o
brilho da tela. Então
vocês podem pensar que consigo...
deixe-me ver qual é o brilho máximo.
Ok, agora está no máximo.
Vocês podem imaginar que eu
poderia fazer algo como echo,
vamos reduzir,
echo 500 para brightness,
se faço isso ele diz
que a permissão foi negada. Eu não posso
modificar o brilho porque, para fazê-lo,
para modificar coisas no
kernel, é preciso ser o
administrador. Vocês podem pensar
que a forma de resolver isso é digitar
sudo echo 500 mas ainda assim a
permissão é negada. Por que?
Porque, como mencionei, esses
redirecionamentos de entrada e saída não
são algo que os programas saibam quando
usamos o pipe com o ls e o tail, o tail
não sabia do ls e o ls não sabia do tail.
O pipe e o redirecionamento foram estabelecidos
pelo shell, então, nesse caso,
o que está ocorrendo é que estou dizendo ao shell
para rodar o programa sudo com os argumentos
echo e 500 e mandar essa saída para o
arquivo chamado brightness, mas é o shell
que está abrindo o arquivo brightness,
não o programa sudo. Nesse caso, é
o shell que está rodando quando eu tento
abrir o arquivo brightness para escrever nele
e ele não tem permissão para fazer isso.
Portanto, ele dá erro.
Vocês já devem ter visto isso quando
buscam algo e acabam, no Stack Overflow
e dizem para rodar um comando tal
e eles falam, por exemplo,
eles dão uma instrução
como 1 > /sys/class
net ipv4 word, por exemplo.
Isso é algo que vocês podem ter visto se
tiverem tentado configurar um firewall
e esse comando tem de funcionar
porque o simbolozinho de hashtag
indica que deve roda como root.
Isso é raramente explicado,
mas é isso que o # significa.
Vejam no meu prompt um símbolo $
que indica
que não estou rodando como root.
Então a questão é como eu faço pra resolver isso?
Bem, eu poderia mudar para outro terminal
como root, e um jeito de fazer isso é
rodar sudo su, que significa 'rode o seguinte
comando como root' e o su é um comando
complicado que nos abre um shell como
super usuário. Então se faço isso,
entro a senha, vocês podem ver
que o nome de usuário no início
mudou de john para root, e o prompt
mudou de $ para #.
Se eu agora der echo 500 para
o arquivo brightness, minha tela
ficou um pouco mais escura. Vocês
não conseguem ver então terão de acreditar em mim. Não deu nenhum
erro porque agora o shell está
rodando como root e não mais como
john. O usuário root tem permissão de
abrir esse arquivo. Mas com o que sabemos
sobre o terminal agora, há, na verdade,
uma maneira de fazer isso sem ter
de abrir um shell root. Funciona assim.
Deixe-me voltar para 1060.
Vocês vêem por que está diferente
aqui? Estou dizendo ao shell para
rodar o comando echo 1060,
e estou dizendo para rodar o
comando sudo tee brightness.
Estou dizendo para mandar a saída do
echo para o sudo tee. Para entender isso
vocês precisam saber o que o comando tee faz.
O comando tee pega sua entrada e a escreve
tanto em um arquivo quanto na tela.
Então o tee é uma maneira conveniente se
vocês tiverem, por exemplo, um arquivo de logs que queiram enviar
para deixar guardado para mais tarde,
mas também querem checar vocês mesmos.
Vocês podem usar o pipe para mandá-lo para o tee, passar o nome de
um arquivo e ele vai escrever o que quer que esteja na sua
entrada tanto no arquivo quanto na sua
tela. Aqui estou aproveitando esse
programa, estou dizendo 'rode o tee como
rota e use o tee direto no arquivo brightness.
Nesse caso, o programa tee,
que é quem está abrindo o arquivo brightness,
está rodando como root, então ele
tem permissão de fazer isso.
Se eu rodar de novo, vocês não conseguem
ver, mas o brilho aumentou no laptop,
não deu nenhum erro
e não foi preciso abrir um shell como
root e rodar comandos nele,
o que muitas vezes pode ser perigoso.
Se vocês quiserem explorar esses arquivos de sistema
um pouco mais, há bastante coisa
interessante aqui. Se vocês
derem uma navegada por aqui,
vão achar bastante coisas divertidas.
Por exemplo, nós notamos que tem um
comando legal para o brilho aqui, que
outros tipos de brilhos eu poderia definir?
Eu posso usar o comando find, sobre o
qual também vamos falar numa próxima aula,
Quero olhar qualquer arquivo cujo nome
se parece com brightness no
diretório atual. Não ajudou muito, talvez
não sejam arquivos. Será que soletrei errado?
Hum, por que não funciona?
Oh, parece que ele não quer buscar por
brightness. Para a sorte de vocês eu já
conheço um legal.
Há um subdiretório chamado leds e
leds também têm brilho. Que tipos de leds
existem? Um monte!
Por exemplo, o led da tecla scroll lock.
A maioria de vocês provavelmente não sabe
o que é o led do scroll lock e muito
menos o que o scroll lock faz. Talvez vocês já viram uma tecla
no teclado chamada scroll lock.
Basicamente ninguém mais sabe pra que
serve, ninguém usa pra nada.
É quase uma tecla morta e
um led morto. E se vocês quisessem
configurá-lo para que, toda vez que
chegar um e-mail, o led do scroll lock acender?
Por que não tem nenhuma outra razão para
ele acender. Bem, se entrarmos nesse
diretório que tem um brilho
definido como 0.
Bom, o que acontece se eu escrever 1 nele?
É aconselhável vocês não saírem
escrevendo números aleatórios em qualquer arquivo
deste diretório porque isso vai afetar
diretamente o kernel. Dêem uma olhada antes
no que os arquivos fazem. Nesse caso aqui,
eu fiz uma pesquisa prévia com cuidado.
Vocês não conseguem ver, mas agora
no meu teclado o led da tecla scroll lock
está aceso. Se eu escrevesse um programa
que checa e-mails, eu poderia, no final
do programa, rodar um outro programa que
manda echo 1 para este arquivo, e portanto
teria uma maneira de acender o led do meu
teclado para indicar que chegou um e-mail.
Nessas alturas, vocês já devem saber
mais ou menos se virar
com o terminal, o shell e conhecer o
bastante para realizar essas tarefas
simples, ao menos teoricamente. Vocês não
deveriam mais precisar de
interfaces dependentes do mouse para
encontrar arquivos.
Um truque que faltou mostrar e vocês
podem precisar é o de abrir arquivos.
Até agora só mostrei como encontrar
arquivos, mas algo que vocês precisam
saber nesse curso é usar o
xdg-open. Esse provavelmente só vai
funcionar no Linux. Acho que no MacOS ele
se chama open e no Windows... sei lá.
O xdg-open recebe o nome de um arquivo e
vai abri-lo usando o programa apropriado.
Se vocês derem xdg-open em um arquivo
html, ele vai abrir o navegador
e abrir o arquivo. Uma vez que têm esse
programa, teoricamente vocês não
precisam nunca mais abrir uma janela do
buscador. Talvez precisem por outros
motivos, mas em teoria vocês conseguem
fazer tudo usando as ferramentas
que aprendemos hoje. Talvez pareça tudo
relativamente básico para alguns de vocês,
mas como eu mencionei, hoje tivemos
uma introdução. Agora sabemos como o
shell funciona e muito do que vamos
fazer nas próximas aulas é usar esse
conhecimento para fazer coisas bem
interessantes usando o shell.
Ou seja, hoje vimos como usar a interface
que vamos precisar, então é importante
todos saberem. Na próxima aula,
vamos falar bastante sobre como
automatizar tarefas como essas,
como escrever scripts que rodam um monte
de programas pra nós, usando
condicionais, loops etc no terminal,
ou mesmo coisas como rodar
um programa até ele quebrar, o que pode
ser bem útil em casos que queremos
rodar algo até os testes darem erro,
por exemplo. Então esse será o tópico da
aula na próxima semana. Você tinha uma pergunta?
Sim, com relação ao que você mostrou no
diretório sys, provavelmente só vai funcionar
se você estiver usando o subsistema do Windows pro Linux...
Boa pergunta, eu não sei se
o subsistema do Windows para Linux vai
deixar aberto esses arquivos de sistema no sys. Se deixar,
provavelmente vai mostrar só
umas poucas coisas...
Não sei, dê uma olhada.
Algo que vocês vão ver é que as notas
de aula dessa aula já estão
online, e no final do arquivo
tem diversos exercícios. Alguns
são relativamente fáceis, outros um
pouco mais difíceis. Sugerimos
tentar resolvê-los.
Se vocês já sabem esse conteúdo,
vai ser bem rápido,
e se não sabem vai servir para aprenderem
um monte de coisas que talvez vocês
percebam que não sabiam. No tira-dúvidas,
que vai acontecer logo
após essa aula, ficaremos felizes
em ajudá-los com os exercícios ou
com outros comandos que vocês vão
aprender nesse processo e queiram saber
como usar de forma eficiente. Enão na
próxima aula, já amanhã, vamos assumir
que vocês estão por dentro desse tipo de coisa
que os exercícios vão ensinar.
Há também um endereço de e-mail
no website, vocês podem mandar questões
que aparecerem depois do tira dúvidas.
Mais alguma pergunta
antes de terminar por hoje? Não?
Tudo bem, estaremos disponíveis no
nono andar do prédio Gates, o 32,
dentro de cinco minutos.
Vejo vocês lá!