<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Sabrina - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Sabrina - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 30 May 2026 13:56:24 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/sabrina/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ O manual de comandos do Linux – aprenda comandos do Linux para iniciantes ]]>
                </title>
                <description>
                    <![CDATA[ Este manual de comandos do Linux apresentará os 60 comandos principais que você precisará como desenvolvedor. Cada comando inclui código de exemplo e dicas sobre quando usá-lo. Este Manual de Comando do Linux segue a regra 80/20: você aprenderá 80% de um tópico em cerca de 20% do tempo gasto ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/</link>
                <guid isPermaLink="false">65a975770cfcc403cf78a174</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sabrina ]]>
                </dc:creator>
                <pubDate>Wed, 26 Jun 2024 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/cover-1.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/the-linux-commands-handbook/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The Linux Command Handbook – Learn Linux Commands for Beginners</a>
      </p><p>Este manual de comandos do Linux apresentará os 60 comandos principais que você precisará como desenvolvedor. Cada comando inclui código de exemplo e dicas sobre quando usá-lo.</p><p>Este Manual de Comando do Linux segue a regra 80/20: você aprenderá 80% de um tópico em cerca de 20% do tempo gasto estudando-o.</p><p>Acho que essa abordagem oferece uma visão geral completa.</p><p>Este manual não tenta cobrir tudo relacionado ao Linux e seus comandos. Ele se concentra nos pequenos comandos principais que você usará 80% ou 90% do tempo e tenta simplificar o uso dos mais complexos.</p><p>Todos esses comandos funcionam em Linux, macOS, WSL e em qualquer lugar onde você tenha um ambiente UNIX.</p><p>Espero que o conteúdo deste manual o ajude a alcançar o que deseja: <strong>familiarizar-se com o Linux.</strong></p><p>Você pode marcar esta página em seu navegador para poder consultar este manual no futuro.</p><p>Você pode <a href="https://flaviocopes.com/page/linux-commands-handbook/">fazer o download deste manual em PDF/ePUB/Mobi gratuitamente</a>.</p><p>Aproveite!</p><h2 id="-ndice"><strong>Índice</strong></h2><ul><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#introdu-o-ao-linux-e-shells">Introdução ao Linux e shells</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-man-no-linux">O comando <code>man</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-ls-no-linux">O comando <code>ls</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-cd-no-linux">O comando <code>cd</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-pwd-no-linux">O comando <code>pwd</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-mkdir-no-linux">O comando <code>mkdir</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-rmdir-no-linux">O comando <code>rmdir</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-mv-no-linux">O comando <code>mv</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-cp-no-linux">O comando <code>cp</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-open-no-linux">O comando <code>open</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-touch-no-linux">O comando <code>touch</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-find-no-linux">O comando <code>find</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-ln-no-linux">O comando <code>ln</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-gzip-no-linux">O comando <code>gzip</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-gunzip-no-linux">O comando <code>gunzip</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-tar-no-linux">O comando <code>tar</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-alias-no-linux">O comando <code>alias</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-cat-no-linux">O comando <code>cat</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-less-no-linux">O comando <code>less</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-tail-no-linux">O comando <code>tail</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-wc-no-linux">O comando <code>wc</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-grep-no-linux">O comando <code>grep</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-sort-no-linux">O comando <code>sort</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-uniq-no-linux">O comando <code>uniq</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-diff-no-linux">O comando <code>diff</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-echo-no-linux">O comando <code>echo</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-chown-no-linux">O comando <code>chown</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-chmod-no-linux">O comando <code>chmod</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-umask-no-linux">O comando <code>umask</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-du-no-linux">O comando <code>du</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-df-no-linux">O comando <code>df</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-basename-no-linux">O comando <code>basename</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-dirname-no-linux">O comando <code>dirname</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-ps-no-linux">O comando <code>ps</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-top-no-linux">O comando <code>top</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-kill-no-linux">O comando <code>kill</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-killall-no-linux">O comando <code>killall</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-jobs-no-linux">O comando <code>jobs</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-bg-no-linux">O comando <code>bg</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-fg-no-linux">O comando <code>fg</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-type-no-linux">O comando <code>type</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-which-no-linux">O comando <code>which</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-nohup-no-linux">O comando <code>nohup</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-xargs-no-linux">O comando <code>xargs</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-do-editor-vim-no-linux">O comando do editor <code>vim</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-do-editor-emacs-no-linux">O comando do editor <code>emacs</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-do-editor-nano-no-linux">O comando do editor <code>nano</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-whoami-no-linux">O comando <code>whoami</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-who-no-linux">O comando <code>who</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-su-no-linux">O comando <code>su</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-sudo-no-linux">O comando <code>sudo</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-passwd-no-linux">O comando <code>passwd</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-ping-no-linux">O comando <code>ping</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-traceroute-no-linux">O comando <code>traceroute</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-clear-no-linux">O comando <code>clear</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-history-no-linux">O comando <code>history</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-export-no-linux">O comando <code>export</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-crontab-no-linux">O comando <code>crontab</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-uname-no-linux">O comando <code>uname</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-env-no-linux">O comando <code>env</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#o-comando-printenv-no-linux">O comando <code>printenv</code> no Linux</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-comandos-do-linux-aprenda-comandos-do-linux-para-iniciantes/#conclus-o">Conclusão</a></li></ul><h2 id="introdu-o-ao-linux-e-shells"><strong>Introdução ao Linux e shells</strong></h2><h3 id="o-que-linux"><strong>O que é Linux?</strong></h3><p>Linux é um sistema operacional, como o &nbsp;macOS ou Windows.</p><p>É também o sistema operacional de código aberto mais popular, oferecendo muita liberdade.</p><p>Ele alimenta a grande maioria dos servidores que compõem a Internet. É a base sobre a qual tudo é construído, mas não apenas isso. O Android é baseado em (uma versão modificada do) Linux.</p><p>O "núcleo" do Linux (chamado de kernel) nasceu em 1991 na Finlândia e percorreu um longo caminho desde seu início humilde. Passou a ser o kernel do Sistema Operacional GNU, criando a dupla GNU/Linux.</p><p>Há uma coisa no Linux que empresas como Microsoft, Apple e Google nunca poderão oferecer: a liberdade de fazer o que quiser com seu computador.</p><p>Na verdade, elas estão indo na direção oposta, construindo jardins murados, especialmente no lado dos dispositivos móveis.</p><p>Linux é a liberdade definitiva.</p><p>É desenvolvido por voluntários, alguns pagos por empresas que dependem dele, outros de maneira independente. Não existe, porém, uma única empresa comercial que possa ditar o que acontece no Linux ou as prioridades do projeto.</p><p>Você também pode usar o Linux como seu computador diário. Eu uso o macOS porque gosto muito das aplicações e do design (e também fui desenvolvedor de aplicações para iOS e Mac). Antes de usar o macOS, no entanto, eu usei o Linux como sistema operacional principal do meu computador.</p><p>Ninguém pode ditar quais aplicações você pode executar ou "ligar para casa" com aplicações que rastreiam você, sua posição e muito mais.</p><p>O Linux também é especial porque não existe apenas "um Linux", como é o caso do Windows ou do macOS. Em vez disso, temos <strong>distribuições</strong>.</p><p>Uma "distro" é feita por uma empresa ou organização e empacota o núcleo do Linux com programas e ferramentas adicionais.</p><p>Por exemplo, você tem o Debian, o Red Hat e o Ubuntu, provavelmente as distribuições mais populares.</p><p>Existem, porém, muitas, muitas mais. Você também pode criar sua própria distribuição, mas, provavelmente, usará uma popular que tenha muitos usuários e uma comunidade de pessoas ao seu redor. Isso permite que você faça o que precisa sem perder muito tempo reinventando a roda e descobrindo respostas para problemas comuns.</p><p>Alguns computadores desktop e laptops vêm com Linux pré-instalado. Você também pode instalá-lo em seu computador Windows ou Mac.</p><p>Você, no entanto, não precisa interromper seu computador existente apenas para ter uma ideia de como o Linux funciona.</p><p>Eu não tenho um computador Linux.</p><p>Se você usa um Mac, você só precisa saber que o macOS é um sistema operacional UNIX. Ele compartilha muitas das mesmas ideias e software que um sistema GNU/Linux usa, porque GNU/Linux é uma alternativa gratuita ao UNIX.</p><blockquote><em><em><a href="https://en.wikipedia.org/wiki/Unix">UNIX</a> </em></em>é um termo genérico que agrupa muitos sistemas operacionais usados ​​em grandes corporações e instituições, a partir da década de 1970</blockquote><p>O terminal do macOS dá acesso exatamente aos mesmos comandos que descreverei no restante deste manual.</p><p>A Microsoft tem um <a href="https://docs.microsoft.com/en-us/windows/wsl/install-win10">subsistema oficial do Windows para Linux</a> que você pode (e deve!) instalar no Windows. Isso dará a você a capacidade de executar o Linux de uma maneira muito fácil em seu PC.</p><p>Na grande maioria das vezes, porém, você executará um computador Linux na nuvem por meio de um VPS (Virtual Private Server) como o DigitalOcean.</p><h3 id="o-que-um-shell-linux"><strong>O que é um shell Linux?</strong></h3><p>Um shell é um interpretador de comandos que expõe uma interface para o usuário trabalhar com o sistema operacional subjacente.</p><p>Ele permite executar operações usando texto e comandos e fornece aos usuários recursos avançados, como a capacidade de criar scripts.</p><p>Isso é importante: os shells permitem que você execute as coisas de uma maneira mais otimizada do que uma GUI (Interface Gráfica do Usuário) poderia permitir. As ferramentas de linha de comando podem oferecer muitas opções de configuração diferentes sem serem muito complexas de usar.</p><p>Existem muitos tipos diferentes de shells. Este artigo se concentra em shells Unix, aqueles que você encontrará comumente em computadores Linux e macOS.</p><p>Muitos tipos diferentes de shells foram criados para esses sistemas ao longo do tempo. Alguns deles dominam o espaço: Bash, Csh, Zsh, Fish e muitos mais!</p><p>Todas os shells são originários de Bourne Shell, chamada <code>sh</code>. "Bourne" porque seu criador foi Steve Bourne.</p><p>Bash significa Bourne-again shell. O <code>sh</code> era proprietário e não de código aberto, e o Bash foi criado em 1989 para criar uma alternativa livre para o projeto GNU e a Free Software Foundation. Como os projetos tinham que pagar para usar o shell Bourne, o Bash se tornou muito popular.</p><p>Se você usa um Mac, tente abrir o terminal Mac. Por padrão, ele executa ZSH (ou, pré-Catalina, o Bash).</p><p>Você pode configurar seu sistema para executar qualquer tipo de shell – por exemplo, eu uso o shell Fish.</p><p>Cada shell tem seus próprios recursos exclusivos e uso avançado, mas todos compartilham uma funcionalidade comum: permitem executar programas e podem ser programados.</p><p>No restante deste manual, veremos em detalhes os comandos mais comuns que você utilizará.</p><h2 id="o-comando-man-no-linux"><strong>O comando <code>man</code> no Linux</strong></h2><p>‌‌O primeiro comando que apresentarei ajudará você a entender todos os outros comandos.</p><p>Toda vez que não sei como usar um comando, digito <code>man &lt;comando&gt;</code> para obter o manual:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-07-04-at-18.42.40-1.png" class="kg-image" alt="Screen-Shot-2020-07-04-at-18.42.40-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-07-04-at-18.42.40-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screen-Shot-2020-07-04-at-18.42.40-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-07-04-at-18.42.40-1.png 1188w" sizes="(min-width: 720px) 720px" width="1188" height="894" loading="lazy"></figure><p>Esta é uma página man (de <em>manual</em>). As páginas de manual são uma ferramenta essencial para aprender como desenvolvedor. Elas contêm tanta informação que, às vezes, é quase demais. A captura de tela acima é apenas uma das 14 telas de explicação do comando <code>ls</code> .</p><p>Na maioria das vezes, quando preciso aprender um comando rapidamente, uso este site chamado páginas tldr: <a href="https://tldr.sh/">https://tldr.sh</a>. É um comando que você pode instalar e executar assim: <code>tldr &lt;comando&gt;</code>. Ele fornece uma visão geral muito rápida de um comando, com alguns exemplos úteis de cenários de uso comuns:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.35.41-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-07.35.41-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-07.35.41-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screen-Shot-2020-09-07-at-07.35.41-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.35.41-1.png 1002w" sizes="(min-width: 720px) 720px" width="1002" height="864" loading="lazy"></figure><p>Ele não é um substituto para o <code>man</code>, mas uma ferramenta útil para evitar de se perder na enorme quantidade de informações presentes em uma página <code>man</code>. Em seguida, você pode usar a página <code>man</code> para explorar todas as diferentes opções e parâmetros que você pode usar em um comando.</p><h2 id="o-comando-ls-no-linux"><strong>O comando <code>ls</code> no Linux</strong></h2><p>Dentro de uma pasta você pode listar todos os arquivos que a pasta contém usando o comando <code>ls</code> :</p><pre><code>ls</code></pre><p>‌Se você adicionar um nome ou caminho de pasta, o conteúdo dessa pasta será impresso:</p><pre><code>ls /bin</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-09-at-18.50.14-1.png" class="kg-image" alt="Screenshot-2019-02-09-at-18.50.14-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screenshot-2019-02-09-at-18.50.14-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screenshot-2019-02-09-at-18.50.14-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-09-at-18.50.14-1.png 1289w" sizes="(min-width: 720px) 720px" width="1289" height="425" loading="lazy"></figure><p>O <code>ls</code> aceita muitas opções. Uma das minhas combinações favoritas é a <code>-al</code>. Tente:</p><pre><code>ls -al /bin</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-09-at-18.49.52-1.png" class="kg-image" alt="Screenshot-2019-02-09-at-18.49.52-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screenshot-2019-02-09-at-18.49.52-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screenshot-2019-02-09-at-18.49.52-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-09-at-18.49.52-1.png 1289w" sizes="(min-width: 720px) 720px" width="1289" height="777" loading="lazy"></figure><p>Comparado ao comando <code>ls</code> simples, ele retorna muito mais informações.</p><p>Você tem, da esquerda para a direita:</p><ul><li>as permissões de arquivo (e se o seu sistema suportar ACLs, você também receberá um sinalizador de ACL)</li><li>o número de links para esse arquivo</li><li>o dono do arquivo</li><li>o grupo do arquivo</li><li>o tamanho do arquivo em bytes</li><li>a data e hora da última modificação do arquivo</li><li>o nome do arquivo</li></ul><p>Esse conjunto de dados é gerado pela opção <code>l</code>. A opção <code>a</code> também mostra os arquivos ocultos.</p><p>Arquivos ocultos são arquivos que começam com um ponto (<code>.</code>).</p><h2 id="o-comando-cd-no-linux"><strong>O comando <code>cd</code> no Linux</strong></h2><p>Depois de ter uma pasta, você pode movê-la usando o comando <code>cd</code>. <code>cd</code> significa <strong>alterar diretório </strong>(do inglês, <em>change directory</em>). Você o invoca especificando uma pasta para a qual mover. Você pode especificar um nome de pasta ou um caminho completo.</p><p>Exemplo:</p><pre><code>mkdir fruits
cd fruits</code></pre><p>‌ Agora, você está na pasta <code>fruits</code>.</p><p>Você pode usar o caminho especial <code>..</code> para indicar a pasta pai:</p><pre><code>cd .. #retorno à pasta pai</code></pre><p>O caractere # indica o início do comentário, que dura toda a linha após ser encontrado.</p><p>Você pode usar o comando <code>cd</code> junto do caminho especial para formar um caminho:</p><pre><code class="language-bash">mkdir fruits
mkdir cars
cd fruits
cd ../cars</code></pre><p>Existe outro indicador de caminho especial, que é o <code>.</code>, que indica a pasta <strong>atual</strong>.</p><p>Você também pode usar caminhos absolutos, que começam na pasta raiz <code>/</code>:</p><pre><code class="language-bash">cd /etc</code></pre><h2 id="o-comando-pwd-no-linux">O comando <code>pwd</code> no Linux</h2><p>Sempre que você se sentir perdido no sistema de arquivos, chame o comando <code>pwd</code> para saber onde você está:</p><pre><code class="language-bash">pwd</code></pre><p>Ele imprimirá o caminho da pasta atual.</p><h2 id="o-comando-mkdir-no-linux"><strong>O comando <code>mkdir</code> no Linux</strong></h2><p>Você pode criar pastas usando o comando <code>mkdir</code>:</p><pre><code class="language-bash">mkdir fruits</code></pre><p>Você pode criar várias pastas com um comando:</p><pre><code class="language-bash">mkdir dogs cars</code></pre><p>Você também pode criar várias pastas aninhadas adicionando a opção &nbsp;<code>-p</code>:</p><pre><code class="language-bash">mkdir -p fruits/apples</code></pre><p>As opções nos comandos UNIX geralmente assumem esse formato. Você os adiciona logo após o nome do comando e eles mudam o comportamento do comando. Muitas vezes, você também pode combinar várias opções.</p><p>Você pode descobrir quais opções um comando suporta digitando <code>man &lt;nome_do_comando&gt;</code>. Tente agora com <code>man mkdir</code>, por exemplo, (pressione a tecla <code>q</code> para sair da página de manual). As páginas de manual são a incrível ajuda integrada para UNIX.</p><h2 id="o-comando-rmdir-no-linux"><strong>O comando <code>rmdir</code> no Linux</strong></h2><p>Assim como você pode criar uma pasta usando <code>mkdir</code>, você pode excluir uma pasta usando <code>rmdir</code>:</p><pre><code class="language-bash">mkdir fruits
rmdir fruits</code></pre><p>Você também pode excluir várias pastas de uma vez:</p><pre><code class="language-bash">mkdir fruits cars
rmdir fruits cars</code></pre><p>‌ A pasta que você exclui deve estar vazia.</p><p>Para excluir pastas com arquivos, usaremos o comando <code>rm</code> mais genérico, que exclui arquivos e pastas, usando a opção <code>-rf</code>:</p><pre><code class="language-bash">rm -rf fruits cars</code></pre><p>Tenha cuidado, pois esse comando não pede confirmação e removerá imediatamente tudo o que você solicitar.</p><p>Não há <strong>bin</strong> ao remover arquivos da linha de comando e recuperar arquivos perdidos pode ser difícil.</p><h2 id="o-comando-mv-no-linux"><strong>O comando <code>mv</code> no Linux</strong></h2><p>Depois de ter um arquivo, você pode movê-lo usando o comando <code>mv</code>. Você especifica o caminho atual do arquivo e seu novo caminho:</p><pre><code class="language-bash">touch test
mv pear new_pear</code></pre><p>O arquivo <code>pear</code> é movido para <code>new_pear</code>. É assim que você <strong>renomeia</strong> arquivos e pastas.</p><p>Se o último parâmetro for uma pasta, o arquivo localizado no caminho do primeiro parâmetro será movido para essa pasta. Nesse caso, você pode especificar uma lista de arquivos e todos eles serão movidos no caminho da pasta identificado pelo último parâmetro:</p><pre><code class="language-bash">touch pear
touch apple
mkdir fruits
mv pear apple fruits #pear e apple são movidos para a pasta fruits</code></pre><h2 id="o-comando-cp-no-linux">O comando <code>cp</code> no Linux</h2><p>Você pode copiar um arquivo usando o comando <code>cp</code>:</p><pre><code class="language-bash">touch test
cp apple another_apple</code></pre><p>Para copiar pastas você precisa adicionar a opção <code>-r</code> para copiar recursivamente todo o conteúdo da pasta:</p><pre><code class="language-bash">mkdir fruits
cp -r fruits cars</code></pre><h2 id="-o-comando-open-no-linux">‌O comando <code>open</code> no Linux</h2><p>O comando <code>open</code> permite abrir um arquivo usando esta sintaxe:‌</p><pre><code class="language-bash">open &lt;nome_do_arquivo&gt;</code></pre><p>Você também pode abrir um diretório, que no macOS abre o aplicativo Finder com o diretório atual aberto:</p><pre><code>open &lt;nome_do_diretório&gt;</code></pre><p>‌ Eu uso isso o tempo todo para abrir o diretório atual:</p><pre><code>open .</code></pre><blockquote><em>O símbolo especial <em> </em></em><code><em><em>.</em></em></code><em><em> </em></em>aponta para o diretório atual, enquanto<em><em> </em></em><code><em><em>..</em></em></code><em><em> </em></em>aponta para o diretório pai</blockquote><p>O mesmo comando também pode ser usado para executar uma aplicação:</p><pre><code>open &lt;nome_da_aplicação&gt;</code></pre><h2 id="-o-comando-touch-no-linux">‌O comando <code>touch</code> no Linux</h2><p>Você pode criar um arquivo vazio usando o comando <code>touch</code>:</p><pre><code>touch apple</code></pre><p>‌Se o arquivo já existir, ele será aberto no modo de gravação e o carimbo de data/hora do arquivo será atualizado.</p><h2 id="o-comando-find-no-linux"><strong>O comando <code>find</code> no Linux</strong></h2><p>O comando <code>find</code> pode ser usado para localizar arquivos ou pastas que correspondam a um padrão de pesquisa específico. Ele pesquisa recursivamente.</p><p>Vamos aprender como usá-lo por meio de um exemplo.</p><p>Encontre todos os arquivos na árvore atual que possuem a extensão <code>.js</code> e imprima o caminho relativo de cada arquivo correspondente:</p><pre><code class="language-bash">find . -name '*.js'</code></pre><p>É importante usar aspas em torno de caracteres especiais como <code>*</code> para evitar que o shell os interprete.</p><p>Encontre diretórios na árvore atual que correspondam ao nome "src":</p><pre><code class="language-bash">find . -type d -name src</code></pre><p>Use <code>-type f</code> para pesquisar apenas arquivos ou <code>-type l</code> para pesquisar apenas links simbólicos.</p><p><code>-name</code> diferencia maiúsculas de minúsculas. Use <code>-iname</code> para realizar uma pesquisa sem distinção entre maiúsculas e minúsculas.</p><p>Você pode pesquisar em várias árvores raiz:</p><pre><code class="language-bash">find folder1 folder2 -name filename.txt</code></pre><p>Encontre diretórios na árvore atual que correspondam ao nome "node_modules" ou 'public':</p><pre><code class="language-bash">find . -type d -name node_modules -or -name public</code></pre><p>Você também pode excluir um caminho da pesquisa usando <code>-not -path</code>:</p><pre><code class="language-bash">find . -type d -name '*.md' -not -path 'node_modules/*'</code></pre><p>Você pode pesquisar arquivos que contenham mais de 100 caracteres (bytes):</p><pre><code class="language-bash">find . -type f -size +100c</code></pre><p>Pesquise arquivos maiores que 100 KB, mas menores que 1 MB:</p><pre><code class="language-bash">find . -type f -size +100k -size -1M</code></pre><p>Pesquise arquivos editados há mais de 3 dias:</p><pre><code class="language-bash">find . -type f -mtime +3</code></pre><p>Pesquise arquivos editados nas últimas 24 horas:</p><pre><code class="language-bash">find . -type f -mtime -1</code></pre><p>Você pode excluir todos os arquivos que correspondem a uma pesquisa adicionando a opção <code>-delete</code>. Isso exclui todos os arquivos editados nas últimas 24 horas:</p><pre><code class="language-bash">find . -type f -mtime -1 -delete</code></pre><p>Você pode executar um comando em cada resultado da pesquisa. No exemplo, executamos <code>cat</code> para imprimir o conteúdo do arquivo:</p><pre><code class="language-bash">find . -type f -exec cat {} \;</code></pre><p>Observe a terminação <code>\;</code>. <code>{}</code> é preenchido com o nome do arquivo em tempo de execução.</p><h2 id="o-comando-ln-no-linux"><strong>O comando <code>ln</code> no Linux</strong></h2><p>O comando <code>ln</code> faz parte dos comandos do sistema de arquivos Linux.</p><p>É usado para criar links. O que é um link? É como um ponteiro para outro arquivo ou um arquivo que aponta para outro arquivo. Você deve estar familiarizado com os atalhos do Windows. Eles são semelhantes.</p><p>Temos 2 tipos de links:<strong> hard links</strong> e <strong>soft</strong> <strong>links.</strong></p><h4 id="hard-links"><strong>Hard links</strong></h4><p>Hard links raramente são usados. Eles têm algumas limitações: você não pode vincular a diretórios e não pode vincular a sistemas de arquivos externos (discos).</p><p>Um <em>hard link</em> é criado usando a seguinte sintaxe:</p><pre><code class="language-bash">ln &lt;original&gt; &lt;link&gt;</code></pre><p>Por exemplo, digamos que você tenha um arquivo chamado recipes.txt (um arquivo de texto com receitas). Você pode criar um <em>hard link</em> para ele usando:</p><pre><code class="language-bash">ln recipes.txt newrecipes.txt</code></pre><p>O novo <em>hard link</em> que você criou é indistinguível de um arquivo normal:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-02-at-11.26.21.png" class="kg-image" alt="Screen-Shot-2020-09-02-at-11.26.21" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-02-at-11.26.21.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-02-at-11.26.21.png 815w" sizes="(min-width: 720px) 720px" width="815" height="389" loading="lazy"></figure><p>Agora, sempre que você editar qualquer um desses arquivos, o conteúdo será atualizado para ambos.</p><p>Se você excluir o arquivo original, o link ainda conterá o conteúdo do arquivo original, pois ele não será removido até que haja um <em>hard link</em> apontando para ele.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-02-at-11.26.07-1.png" class="kg-image" alt="Screen-Shot-2020-09-02-at-11.26.07-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-02-at-11.26.07-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-02-at-11.26.07-1.png 661w" width="661" height="364" loading="lazy"></figure><h3 id="soft-links">Soft links</h3><p><em>Soft links</em> são diferentes. Eles são mais poderosos porque você pode vincular a outros sistemas de arquivos e diretórios. Lembre-se, porém, de que, quando o original for removido, o link será quebrado.</p><p>Você cria links virtuais usando a opção <code>-s</code> de <code>ln</code>:</p><pre><code class="language-bash">ln -s &lt;original&gt; &lt;link&gt;</code></pre><p>Por exemplo, digamos que você tenha um arquivo chamado recipes.txt. Você pode criar um <em>soft link</em> para ele usando:</p><pre><code class="language-bash">ln -s recipes.txt newrecipes.txt</code></pre><p>Nesse caso, você pode ver que há um sinalizador <code>l</code> especial ao listar o arquivo usando <code>ls -al</code>. O nome do arquivo tem um <code>@</code> no final e também tem uma cor diferente se você tiver as cores ativadas:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-02-at-11.27.18-1.png" class="kg-image" alt="Screen-Shot-2020-09-02-at-11.27.18-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-02-at-11.27.18-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-02-at-11.27.18-1.png 980w" sizes="(min-width: 720px) 720px" width="980" height="289" loading="lazy"></figure><p>‌‌Agora, se você excluir o arquivo original, os links serão quebrados e o shell informará "Esse arquivo ou diretório não existe" se você tentar acessá-lo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-02-at-11.27.03-1.png" class="kg-image" alt="Screen-Shot-2020-09-02-at-11.27.03-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-02-at-11.27.03-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-02-at-11.27.03-1.png 815w" sizes="(min-width: 720px) 720px" width="815" height="389" loading="lazy"></figure><h2 id="o-comando-gzip-no-linux">O comando <code>gzip</code> no Linux</h2><p>Você pode compactar um arquivo usando o protocolo de compactação gzip denominado <a href="https://en.wikipedia.org/wiki/LZ77_and_LZ78">LZ77</a> usando o comando <code>gzip</code> .</p><p>Aqui está o uso mais simples:</p><pre><code class="language-bash">gzip filename</code></pre><p>Isso compactará o arquivo e acrescentará uma extensão <code>.gz</code> a ele. O arquivo original é excluído.</p><p>Para evitar isso, você pode usar a opção <code>-c</code> e usar o redirecionamento de saída para gravar a saída no arquivo &nbsp;<code>filename.gz</code> :</p><pre><code class="language-bash">gzip -c filename &gt; filename.gz</code></pre><blockquote>‌<em>A opção<em> <code>-c</code> </em></em>especifica que a saída estará no fluxo de saída padrão, deixando o arquivo original intacto.</blockquote><p>Você também pode usar a opção <code>-k</code>:</p><pre><code class="language-bash">gzip -k filename</code></pre><p>Existem vários níveis de compressão. Quanto maior a compactação, mais tempo levará para compactar (e descompactar). Os níveis variam de 1 (compactação mais rápida e pior) a 9 (compactação mais lenta e melhor) e o padrão é 6.</p><p>Você pode escolher um nível específico com a opção: <code>-&lt;NUMBER&gt;</code>:‌</p><pre><code class="language-bash">gzip -1 filename</code></pre><p>Você pode compactar vários arquivos listando-os:</p><pre><code class="language-bash">gzip filename1 filename2</code></pre><p>Você pode compactar todos os arquivos em um diretório, recursivamente, usando a opção <code>-r</code> :</p><pre><code class="language-bash">gzip -r a_folder</code></pre><p>A opção <code>-v</code> imprime as informações de porcentagem de compactação. Aqui está um exemplo de uso junto com a opção <code>-k</code> (keep):</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-15.55.42-1.png" class="kg-image" alt="Screen-Shot-2020-09-09-at-15.55.42-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-09-at-15.55.42-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-15.55.42-1.png 760w" sizes="(min-width: 720px) 720px" width="760" height="264" loading="lazy"></figure><p><code>gzip</code> também pode ser usado para descompactar um arquivo, usando a opção <code>-d</code> :</p><pre><code class="language-bash">gzip -d filename.gz</code></pre><h2 id="o-comando-gunzip-no-linux">O comando <code>gunzip</code> no Linux</h2><p>O comando <code>gunzip</code> basicamente equivalente ao comando <code>gzip</code>, exceto que a opção <code>-d</code> está sempre habilitada por padrão.</p><p>O comando pode ser invocado desta maneira:‌</p><pre><code class="language-bash">gunzip filename.gz</code></pre><p>Isso compactará e removerá a extensão <code>.gz</code> colocando o resultado no arquivo com &nbsp;<code>filename</code> . Se esse arquivo existir, ele será sobrescrito.</p><p>Você pode extrair para um nome de arquivo diferente usando o redirecionamento de saída usando a opção <code>-c</code> :</p><pre><code class="language-bash">gunzip -c filename.gz &gt; anotherfilename</code></pre><h2 id="o-comando-tar-no-linux">O comando <code>tar</code> no Linux</h2><p>O comando <code>tar</code> é usado para criar um arquivo, agrupando vários arquivos em um único arquivo.</p><p>Seu nome vem do passado e significa arquivo em fita (na época em que os arquivos eram armazenados em fitas – em inglês, <em>Tape ARchive</em>).</p><p>Este comando cria um arquivo chamado <code>archive.tar</code> com o conteúdo de &nbsp;<code>file1</code> &nbsp;e &nbsp;<code>file2</code>:</p><pre><code class="language-bash">tar -cf archive.tar file1 file2</code></pre><blockquote>‌ <em>A opção<em> <code>c</code> </em></em>significa criar. A opção<em><em> <code>f</code> </em></em>é usada para gravar no arquivo.</blockquote><p>Para extrair arquivos de um arquivo na pasta atual, use:</p><pre><code class="language-bash">tar -xf archive.tar</code></pre><blockquote><em>A opção<em> <code>x</code> </em></em>significa extrair.</blockquote><p>Para extraí-los para um diretório específico, use:</p><pre><code class="language-bash">tar -xf archive.tar -C nome_do_diretório</code></pre><p>Você também pode simplesmente listar os arquivos contidos em um arquivo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-16.56.33-1.png" class="kg-image" alt="Screen-Shot-2020-09-09-at-16.56.33-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-09-at-16.56.33-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-16.56.33-1.png 727w" sizes="(min-width: 720px) 720px" width="727" height="264" loading="lazy"></figure><p><code>tar</code> é frequentemente usado para criar um <strong>arquivo compactado</strong>, compactando o arquivo.</p><p>Isso é feito usando a opção <code>z</code> :</p><pre><code class="language-bash">tar -czf archive.tar.gz file1 file2</code></pre><p>É como criar um arquivo tar e executar <code>gzip</code> nele.</p><p>Para desarquivar um arquivo compactado com gzip, você pode usar <code>gunzip</code>, ou <code>gzip -d</code>, e depois desarquivá-lo. <code>tar -xf</code>, no entanto, reconhecerá que é um arquivo compactado e fará isso por você:</p><pre><code class="language-bash">tar -xf archive.tar.gz</code></pre><h2 id="o-comando-alias-no-linux">O comando <code>alias</code> no Linux</h2><p>É comum sempre executar um programa com um conjunto de opções que você gosta de usar.</p><p>Por exemplo, pegue o comando <code>ls</code>. Por padrão, imprime muito pouca informação:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.21.00-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-15.21.00-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-15.21.00-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.21.00-1.png 694w" width="694" height="314" loading="lazy"></figure><p>‌ Se, no entanto, você usar a opção <code>-al</code>, imprimirá algo mais útil, incluindo a data de modificação do arquivo, o tamanho, o proprietário e as permissões. Ele também listará os arquivos ocultos (arquivos que começam com <code>.</code>):</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.21.08-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-15.21.08-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-15.21.08-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.21.08-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="389" loading="lazy"></figure><p>Você pode criar um outro comando – por exemplo, gosto de chamá-lo de <code>ll</code>, que é um alias para <code>ls -al</code>.</p><p>Você faz assim:</p><pre><code class="language-bash">alias ll='ls -al'</code></pre><p>Depois de fazer isso, você pode chamar <code>ll</code> como se fosse um comando normal do UNIX:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.22.51-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-15.22.51-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-15.22.51-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.22.51-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="339" loading="lazy"></figure><p>Chamar &nbsp;<code>alias</code> sem qualquer opção listará os aliases definidos:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.30.19-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-15.30.19-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-15.30.19-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.30.19-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="264" loading="lazy"></figure><p>‌O alias funcionará até que a sessão do terminal seja fechada.</p><p>Para torná-lo permanente, você precisa adicioná-lo à configuração do shell. Pode ser <code>~/.bashrc</code> ou <code>~/.profile</code> ou <code>~/.bash_profile</code> se você usar o shell Bash, dependendo do caso de uso.</p><p>Tenha cuidado com aspas se você tiver variáveis no comando: se você usar aspas duplas, a variável será resolvida no momento da definição. Se você usar aspas simples, ela será resolvida no momento da invocação. Os dois comandos abaixo são diferentes:</p><pre><code class="language-bash">alias lsthis="ls $PWD"
alias lscurrent='ls $PWD'</code></pre><p>$PWD refere-se à pasta atual em que o shell está. Se você navegar para uma nova pasta, <code>lscurrent</code> listará os arquivos na nova pasta, enquanto <code>lsthis</code> ainda listará os arquivos na pasta onde você estava quando definiu o alias.</p><h2 id="o-comando-cat-no-linux"><strong>O comando <code>cat</code> no Linux</strong></h2><p>Semelhante a <a href="https://www.freecodecamp.org/news/unix-command-tail/"><code>tail</code></a> em alguns aspectos, temos o <code>cat</code>. A diferença está no fato de que <code>cat</code> também pode adicionar conteúdo a um arquivo. Isso o torna superpoderoso.</p><p>Em seu uso mais simples, <code>cat</code> imprime o conteúdo de um arquivo na saída padrão:</p><pre><code class="language-bash">cat file</code></pre><p>Você pode imprimir o conteúdo de vários arquivos:</p><pre><code class="language-bash">cat file1 file2</code></pre><p>Usando o operador de redirecionamento de saída <code>&gt;</code>, você pode concatenar o conteúdo de vários arquivos em um novo arquivo:</p><pre><code class="language-bash">cat file1 file2 &gt; file3</code></pre><p>Usando <code>&gt;&gt;</code>, você pode anexar o conteúdo de vários arquivos em um novo arquivo, criando-o se ele não existir:</p><pre><code class="language-bash">cat file1 file2 &gt;&gt; file3</code></pre><p>Ao visualizar arquivos de código-fonte, é útil ver os números das linhas. Você pode fazer com que o <code>cat</code> os imprima usando a opção <code>-n</code> :</p><pre><code class="language-bash">cat -n file1</code></pre><p>Você só pode adicionar um número a linhas que não estejam em branco usando <code>-b</code>, ou também pode remover todas as múltiplas linhas vazias usando <code>-s</code>.</p><p><code>cat</code> é frequentemente usado em combinação com o operador <code>|</code> para alimentar o conteúdo de um arquivo como entrada para outro comando: <code>cat file1 | outro_comando</code>.</p><h2 id="o-comando-less-no-linux"><strong>O comando <code>less</code> no Linux</strong></h2><p>O comando <code>less</code> é um que eu uso muito. Ele mostra o conteúdo armazenado dentro de um arquivo, em uma interface de usuário agradável e interativa.</p><p>Use: <code>less &lt;nome_do_arquivo&gt;</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-09.11.05-1.png" class="kg-image" alt="Screenshot-2019-02-10-at-09.11.05-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screenshot-2019-02-10-at-09.11.05-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-09.11.05-1.png 929w" sizes="(min-width: 720px) 720px" width="929" height="666" loading="lazy"></figure><p>Quando estiver dentro de uma sessão <code>less</code>, você pode sair dela pressionando <code>q</code>.</p><p>Você pode navegar pelo conteúdo do arquivo usando as teclas das setas para <code>cima</code> e para <code>baixo</code>, ou usando <code>a barra de espaço</code> e <code>b</code> para navegar página por página. Você também pode pular para o final do arquivo pressionando <code>G</code> e voltar ao início pressionando <code>g</code>.</p><p>Você pode pesquisar o conteúdo do arquivo pressionando <code>/</code> digitando uma palavra para pesquisar. Isso busca adiante. Você pode pesquisar para trás usando o símbolo <code>?</code> e digitando uma palavra.</p><p>Esse comando apenas visualiza o conteúdo do arquivo. Você pode abrir um editor diretamente pressionando <code>v</code>. Ele usará o editor do sistema, que, na maioria dos casos, é o <code>vim</code>.</p><p>Pressionar a tecla <code>F</code> entra no modo de acompanhamento ou modo de observação. Quando o arquivo é alterado por outra pessoa, como outro programa, você pode ver as alterações ao vivo.</p><p>Isso não acontece por padrão e você só vê a versão do arquivo no momento em que o abre. Você precisa pressionar <code>ctrl-C</code> para sair deste modo. Nesse caso, o comportamento é semelhante à execução do comando <code>tail -f &lt;nome_do_arquivo&gt;</code> .</p><p>Você pode abrir vários arquivos e navegar por eles usando <code>:n</code> (para ir para o próximo arquivo) e <code>:p</code> (para ir para o anterior).</p><h2 id="o-comando-tail-no-linux"><strong>O comando <code>tail</code> no Linux</strong></h2><p>O melhor caso de uso de tail, na minha opinião, é quando chamado com a opção <code>-f</code>. Ele abre o arquivo no final e observa as alterações no arquivo.</p><p>Sempre que houver novo conteúdo no arquivo, ele será impresso na janela. Isso é ótimo para observar arquivos de log, por exemplo:</p><pre><code class="language-bash">tail -f /var/log/system.log</code></pre><p>Para sair, pressione a tecla <code>ctrl-C</code>.</p><p>Você pode imprimir as últimas 10 linhas de um arquivo:</p><pre><code class="language-bash">tail -n 10 &lt;nome_do_arquivo&gt;</code></pre><p>Você pode imprimir todo o conteúdo do arquivo começando em uma linha específica usando <code>+</code> antes do número da linha:</p><pre><code class="language-bash">tail -n +10 &lt;nome_do_arquivo&gt;</code></pre><p><code>tail</code> pode fazer muito mais e, como sempre, meu conselho é verificar o &nbsp;<code>man tail</code>.</p><h2 id="o-comando-wc-no-linux"><strong>O comando <code>wc</code> no Linux</strong></h2><p>O comando <code>wc</code> nos fornece informações úteis sobre um arquivo ou entrada que ele recebe por meio de <em>pipes</em>.</p><pre><code class="language-bash">echo test &gt;&gt; test.txt
wc test.txt
1       1       5 test.txt</code></pre><p>‌Como exemplo por meio de <em>pipes</em>, podemos contar a saída da execução do comando <code>ls -al</code> :</p><pre><code class="language-bash">ls -al | wc
6      47     284</code></pre><p>A primeira coluna retornada é o número de linhas. O segundo é o número de palavras. O terceiro é o número de bytes.</p><p>Podemos dizer para apenas contar as linhas:</p><pre><code class="language-bash">wc -l test.txt</code></pre><p>ou apenas as palavras:</p><pre><code class="language-bash">wc -w test.txt</code></pre><p> apenas os bytes:</p><pre><code class="language-bash">wc -c test.txt</code></pre><p>Bytes em conjuntos de caracteres ASCII equivalem a caracteres. Com conjuntos de caracteres que não sejam ASCII, o número de caracteres pode ser diferente porque alguns caracteres podem ocupar vários bytes (por exemplo, isso acontece em Unicode).</p><p>Nesse caso, o sinalizador <code>-m</code> ajudará você a obter o valor correto:</p><pre><code class="language-bash">wc -m test.txt</code></pre><h2 id="o-comando-grep-no-linux"><strong>O comando <code>grep</code> no Linux</strong></h2><p>O comando <code>grep</code> é uma ferramenta muito útil. Quando você dominá-lo, ele o ajudará tremendamente na programação do dia a dia.</p><blockquote>Se você está se perguntando,<em><em> <code>grep</code> </em></em>significa impressão de expressão regular global.</blockquote><p>Você pode usar <code>grep</code> &nbsp;para pesquisar arquivos ou combiná-lo com <em>pipes </em>para filtrar a saída de outro comando.</p><p>Por exemplo, aqui está como podemos encontrar as ocorrências da linha <code>document.getElementById</code> no arquivo <code>index.md</code>:</p><pre><code class="language-bash">grep -n document.getElementById index.md</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-09.42.10-1.png" class="kg-image" alt="Screen-Shot-2020-09-04-at-09.42.10-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-04-at-09.42.10-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-09.42.10-1.png 969w" sizes="(min-width: 720px) 720px" width="969" height="314" loading="lazy"></figure><p>‌ Usar a opção <code>-n</code> &nbsp;mostrará os números das linhas:‌ </p><pre><code class="language-bash">grep -n document.getElementById index.md</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-09.47.04-1.png" class="kg-image" alt="Screen-Shot-2020-09-04-at-09.47.04-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-04-at-09.47.04-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-09.47.04-1.png 848w" sizes="(min-width: 720px) 720px" width="848" height="439" loading="lazy"></figure><p>Uma coisa muito útil é dizer ao grep para imprimir 2 linhas antes e 2 linhas depois da linha correspondente para dar a ele mais contexto. Isso é feito usando a opção <code>-C</code>, que aceita várias linhas:</p><pre><code class="language-bash">grep -nC 2 document.getElementById index.md</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-09.44.35-1.png" class="kg-image" alt="Screen-Shot-2020-09-04-at-09.44.35-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-04-at-09.44.35-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-09.44.35-1.png 958w" sizes="(min-width: 720px) 720px" width="958" height="539" loading="lazy"></figure><p>A pesquisa diferencia maiúsculas de minúsculas por padrão. Use o sinalizador <code>-i</code> para não diferenciar.</p><p>Conforme mencionado, você pode usar grep para filtrar a saída de outro comando. Podemos replicar a mesma funcionalidade acima usando:</p><pre><code class="language-bash">less index.md | grep -n document.getElementById</code></pre><p>A string de pesquisa pode ser uma expressão regular e isso torna o <code>grep</code> muito poderoso.</p><p>Outra coisa que você pode achar muito útil é inverter o resultado, excluindo as linhas que correspondem a uma string específica, usando a opção <code>-v</code> :</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-09.42.04-1.png" class="kg-image" alt="Screen-Shot-2020-09-04-at-09.42.04-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-04-at-09.42.04-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-09.42.04-1.png 969w" sizes="(min-width: 720px) 720px" width="969" height="314" loading="lazy"></figure><h2 id="o-comando-sort-no-linux"><strong>O comando <code>sort</code> no Linux</strong></h2><p>Suponha que você tenha um arquivo de texto que contém nomes de cachorros:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.56.28-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-07.56.28-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-07.56.28-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.56.28-1.png 694w" width="694" height="414" loading="lazy"></figure><p>Essa lista não está ordenada.</p><p>O comando <code>sort</code> ajuda você a classificá-los por nome:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.57.08-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-07.57.08-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-07.57.08-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.57.08-1.png 694w" width="694" height="414" loading="lazy"></figure><p>Use a opção <code>r</code> para reverter a ordem:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.57.28-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-07.57.28-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-07.57.28-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.57.28-1.png 683w" width="683" height="364" loading="lazy"></figure><p>A classificação por padrão diferencia maiúsculas de minúsculas e é alfabética. Use a opção <code>--ignore-case</code> para classificar sem distinção entre maiúsculas e minúsculas e a opção <code>-n</code> para classificar usando uma ordem numérica.</p><p>Se o arquivo tiver linhas duplicadas:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.59.03-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-07.59.03-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-07.59.03-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.59.03-1.png 782w" sizes="(min-width: 720px) 720px" width="782" height="514" loading="lazy"></figure><p>Você pode usar a opção <code>-u</code> para removê-los:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.59.16-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-07.59.16-1" width="562" height="339" loading="lazy"></figure><p><code>sort</code> não funciona apenas em arquivos, como muitos comandos UNIX fazem – ele também funciona com <em>pipes</em>. Portanto, você pode usá-lo na saída de outro comando. Por exemplo, você pode ordenar os arquivos retornados por <code>ls</code> com:</p><pre><code class="language-bash">ls | sort</code></pre><p><code>sort</code> é muito poderoso e tem muito mais opções, que você pode explorar chamando <code>man sort</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-08.01.27-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-08.01.27-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-08.01.27-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screen-Shot-2020-09-07-at-08.01.27-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-08.01.27-1.png 1387w" sizes="(min-width: 720px) 720px" width="1387" height="1514" loading="lazy"></figure><h2 id="o-comando-uniq-no-linux"><strong>O comando <code>uniq</code> no Linux</strong></h2><p><code>uniq</code> é um comando que ajuda a classificar linhas de texto.</p><p>Você pode obter essas linhas de um arquivo ou usar <em>pipes </em>da saída de outro comando:</p><pre><code class="language-bash">uniq dogs.txt

ls | uniq</code></pre><p>Você precisa considerar este ponto importante: o <code>uniq</code> detectará apenas linhas duplicadas adjacentes.</p><p>Isso implica que você provavelmente o usará junto com <code>sort</code>:</p><pre><code class="language-bash">sort dogs.txt | uniq</code></pre><p>O comando <code>sort</code> tem sua própria maneira de remover duplicatas com a opção <code>-u</code> (<em><em>unique</em></em>). Mas <code>uniq</code> tem mais poder.</p><p>Por padrão, ele remove linhas duplicadas:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-08.39.35-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-08.39.35-1" width="562" height="564" loading="lazy"></figure><p>Você pode instruí-lo para exibir apenas linhas duplicadas, por exemplo, com a opção <code>-d</code> :</p><pre><code class="language-bash">sort dogs.txt | uniq -d</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-08.36.50-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-08.36.50-1" width="562" height="464" loading="lazy"></figure><p>Você pode usar o comando <code>-u</code> para exibir apenas linhas não duplicadas:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-08.38.50-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-08.38.50-1" width="562" height="514" loading="lazy"></figure><p>Você pode contar as ocorrências de cada linha com a opção <code>-c</code> :</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-08.37.15.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-08.37.15" width="562" height="564" loading="lazy"></figure><p>Use a combinação especial:</p><pre><code class="language-bash">sort dogs.txt | uniq -c | sort -nr</code></pre><p>Assim, você classificará essas linhas pelas mais frequentes:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-08.37.49-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-08.37.49-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-08.37.49-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-08.37.49-1.png 606w" width="606" height="339" loading="lazy"></figure><h2 id="o-comando-diff-no-linux"><strong>O comando <code>diff</code> no Linux</strong></h2><p><code>diff</code> é um comando útil. Suponha que você tenha 2 arquivos que contêm quase as mesmas informações, mas não consegue encontrar a diferença entre os dois.</p><p><code>diff</code> processará os arquivos e dirá qual é a diferença.</p><p>Suponha que você tem dois arquivos: <code>dogs.txt</code> e <code>moredogs.txt</code>. A diferença é que <code>moredogs.txt</code> contêm mais um nome de cachorro:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-08.55.18-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-08.55.18-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-08.55.18-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-08.55.18-1.png 672w" width="672" height="339" loading="lazy"></figure><p><code>diff dogs.txt moredogs.txt</code> dirá que o segundo arquivo tem mais uma linha, a linha 3 com o nome <code>Vanille</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-08.56.05-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-08.56.05-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-08.56.05-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-08.56.05-1.png 672w" width="672" height="264" loading="lazy"></figure><p>Se você inverter a ordem dos arquivos, será informado que falta a linha 3 no segundo arquivo, cujo conteúdo é &nbsp;<code>Vanille</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-08.56.10-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-08.56.10-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-08.56.10-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-08.56.10-1.png 672w" width="672" height="264" loading="lazy"></figure><p>Usar a opção <code>-y</code> vai comparar os 2 arquivos linha por linha:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-08.57.56-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-08.57.56-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-08.57.56-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screen-Shot-2020-09-07-at-08.57.56-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-08.57.56-1.png 1068w" sizes="(min-width: 720px) 720px" width="1068" height="364" loading="lazy"></figure><p>A opção <code>-u</code> entretanto, será mais familiar para você, porque é a mesma usada pelo sistema de controle de versão Git para exibir diferenças entre versões:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-08.58.23-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-08.58.23-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-08.58.23-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-08.58.23-1.png 859w" sizes="(min-width: 720px) 720px" width="859" height="339" loading="lazy"></figure><p>A comparação de diretórios funciona da mesma maneira. Você deve usar a opção <code>-r</code> para comparar recursivamente (entrando em subdiretórios):</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-09.01.07-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-09.01.07-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-09.01.07-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-09.01.07-1.png 870w" sizes="(min-width: 720px) 720px" width="870" height="464" loading="lazy"></figure><p>Caso você esteja interessado em quais arquivos diferem, e não no conteúdo, use as opções <code>r</code> e <code>q</code> :</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-09.01.30-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-09.01.30-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-09.01.30-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-09.01.30-1.png 870w" sizes="(min-width: 720px) 720px" width="870" height="264" loading="lazy"></figure><p>Existem muitas outras opções que você pode explorar na página de manual executando <code>man diff</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-09.02.32-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-09.02.32-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-09.02.32-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screen-Shot-2020-09-07-at-09.02.32-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-09.02.32-1.png 1387w" sizes="(min-width: 720px) 720px" width="1387" height="1514" loading="lazy"></figure><h2 id="o-comando-echo-no-linux"><strong>O comando <code>echo</code> no Linux</strong></h2><p>O comando <code>echo</code> faz um trabalho simples: imprime na saída o argumento passado para ele.</p><p>Esse exemplo:</p><pre><code class="language-bash">echo "hello"</code></pre><p>Isso imprimirá <code>hello</code> no terminal.</p><p>Podemos anexar a saída a um arquivo:</p><pre><code class="language-bash">echo "hello" &gt;&gt; output.txt</code></pre><p>Podemos interpolar variáveis de ambiente:</p><pre><code class="language-bash">echo "The path variable is $PATH"</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.44.33-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-15.44.33-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-15.44.33-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.44.33-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="264" loading="lazy"></figure><p>Cuidado, pois os caracteres especiais precisam ser escapados com uma barra invertida <code>\</code>. <code>$</code> por exemplo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.51.18-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-15.51.18-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-15.51.18-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.51.18-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="264" loading="lazy"></figure><p>Este é apenas o começo. Podemos fazer algumas coisas legais quando se trata de interagir com os recursos do shell.</p><p>Podemos repetir os arquivos na pasta atual:</p><pre><code class="language-bash">echo *</code></pre><p>Podemos repetir os arquivos da pasta atual que começam com a letra <code>o</code>:</p><pre><code class="language-bash">echo o*</code></pre><p>Qualquer comando e recurso válido do Bash (ou qualquer shell que você esteja usando) pode ser usado aqui.</p><p>Você pode imprimir o caminho da sua pasta pessoal:</p><pre><code class="language-bash">echo ~</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.46.36-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-15.46.36-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-15.46.36-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.46.36-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="264" loading="lazy"></figure><p>Você também pode executar comandos e imprimir o resultado na saída padrão (ou em arquivo, como você viu):</p><pre><code class="language-bash">echo $(ls -al)</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.48.55-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-15.48.55-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-15.48.55-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.48.55-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="289" loading="lazy"></figure><p>Observe que os espaços em branco não são preservados por padrão. Você precisa colocar o comando entre aspas duplas para fazer isso:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.49.53-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-15.49.53-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-15.49.53-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.49.53-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="314" loading="lazy"></figure><p>Você pode gerar uma lista de strings, por exemplo, intervalos:</p><pre><code class="language-bash">echo {1..5}</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.47.19-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-15.47.19-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-15.47.19-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-15.47.19-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="264" loading="lazy"></figure><h2 id="o-comando-chown-no-linux"><strong>O comando <code>chown</code> no Linux</strong></h2><p>Cada arquivo/diretório em um sistema operacional como Linux ou macOS (e todo sistema UNIX em geral) tem um <strong>proprietário.</strong></p><p>O proprietário de um arquivo pode fazer tudo com ele. Pode decidir o destino desse arquivo.</p><p>O proprietário (e o usuário <code>root</code> ) também pode alterar o proprietário para outro usuário, usando o comando <code>chown</code>:</p><pre><code class="language-bash">chown &lt;owner&gt; &lt;file&gt;</code></pre><p>Assim:</p><pre><code class="language-bash">chown flavio test.txt</code></pre><p>‌Por exemplo, se você tiver um arquivo que pertence ao <code>root</code>, você não poderá escrever nele como outro usuário:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.40.49-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-18.40.49-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-18.40.49-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.40.49-1.png 837w" sizes="(min-width: 720px) 720px" width="837" height="314" loading="lazy"></figure><p>Você pode usar <code>chown</code> para transferir a propriedade para você:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.40.58-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-18.40.58-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-18.40.58-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.40.58-1.png 837w" sizes="(min-width: 720px) 720px" width="837" height="314" loading="lazy"></figure><p>É bastante comum precisar alterar a propriedade de um diretório e recursivamente de todos os arquivos contidos, além de todos os subdiretórios e arquivos contidos neles também.</p><p>Você pode fazer isso usando o sinalizador <code>-R</code> :</p><pre><code class="language-bash">chown -R &lt;proprietário&gt; &lt;arquivo&gt;</code></pre><p>Arquivos/diretórios não têm apenas um proprietário. Eles também têm um <strong>grupo</strong>. Através deste comando, você pode alterar isso simultaneamente enquanto altera o proprietário:</p><pre><code class="language-bash">chown &lt;proprietário&gt;:&lt;grupo&gt; &lt;nome_do_arquivo&gt;</code></pre><p>Exemplo:</p><pre><code class="language-bash">chown flavio:users test.txt</code></pre><p>Você também pode alterar o grupo de um arquivo usando o comando <code>chgrp</code>:</p><pre><code class="language-bash">chgrp &lt;grupo&gt; &lt;nome_do_arquivo&gt;</code></pre><h2 id="o-comando-chmod-no-linux"><strong>O comando <code>chmod</code> no Linux</strong></h2><p>Cada arquivo nos sistemas operacionais Linux/macOS (e sistemas UNIX em geral) possui 3 permissões: leitura, gravação e execução.</p><p>Vá para uma pasta e execute o comando <code>ls -al</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.49.22-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-18.49.22-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-18.49.22-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.49.22-1.png 914w" sizes="(min-width: 720px) 720px" width="914" height="539" loading="lazy"></figure><p>As strings estranhas que você vê em cada linha de arquivo, como <code>drwxr-xr-x</code>, definem as permissões do arquivo ou pasta.</p><p>Vamos dissecá-lo.</p><p>A primeira letra indica o tipo de arquivo:</p><ul><li><code>-</code> significa que é um arquivo normal</li><li><code>d</code> significa que é um diretório</li><li><code>l</code> significa que é um link</li></ul><p>Então você tem 3 conjuntos de valores:</p><ul><li>O primeiro conjunto representa as permissões do <strong>proprietário</strong> do arquivo</li><li>O segundo conjunto representa as permissões dos membros do <strong>grupo</strong> ao qual o arquivo está associado</li><li>O terceiro conjunto representa as permissões de <strong>todos os outros</strong></li></ul><p>Esses conjuntos são compostos por 3 valores. <code>rwx</code> significa que uma pessoa específica tem acesso de leitura (r, de <em>read </em>em inglês), gravação (w, de <em>write</em> em inglês) e execução (de <em>eXecute</em> em inglês). Qualquer coisa removida é trocada por <code>-</code>, que permite formar várias combinações de valores e permissões relativas: <code>rw-</code>, <code>r--</code>, <code>r-x</code>, e assim por diante.</p><p>Você pode alterar as permissões concedidas a um arquivo usando o comando <code>chmod</code>.</p><p><code>chmod</code> pode ser usado de 2 maneiras. O primeiro usa argumentos simbólicos, o segundo usa argumentos numéricos. Vamos começar primeiro com os símbolos, o que é mais intuitivo.</p><p>Você digita <code>chmod</code> seguido por um espaço e uma letra:</p><ul><li><code>a</code> significa tudo</li><li><code>u</code> significa usuário</li><li><code>g</code> significa grupo</li><li><code>o</code> significa outros</li></ul><p>Em seguida, você digita <code>+</code> ou <code>-</code> para adicionar uma permissão ou removê-la. Em seguida, você insere um ou mais símbolos de permissão (<code>r</code>, <code>w</code>, <code>x</code>).</p><p>Tudo seguido do nome do arquivo ou pasta.</p><p>Aqui estão alguns exemplos:</p><pre><code>chmod a+r nome_do_arquivo #todos podem ler
chmod a+rw nome_do_arquivo #todos podem ler e gravar
chmod o-rwx nome_do_arquivo #outros (que não sejam o proprietário, que não estejam no mesmo grupo do arquivo) não têm permissão de ler, gravar ou executar o arquivo</code></pre><p>‌ Você pode aplicar as mesmas permissões a várias personas adicionando várias letras antes do <code>+</code>/<code>-</code>:</p><pre><code>chmod og-r nome_do_arquivo #outros e grupo não podem mais ler</code></pre><p>‌Caso esteja editando uma pasta, você pode aplicar as permissões a todos os arquivos contidos nessa pasta usando o sinalizador <code>-r</code> (recursivo).</p><p>Argumentos numéricos são mais rápidos, mas acho difícil lembrá-los quando você não os usa no dia a dia. Você usa um algarismo que representa as permissões da persona. Este valor numérico pode ser no máximo 7 e é calculado da seguinte forma:</p><ul><li><code>1</code> se tiver permissão de execução</li><li><code>2</code> se tiver permissão de gravação</li><li><code>4</code> se tiver permissão de leitura</li></ul><p>Isso nos dá 4 combinações:</p><ul><li><code>0</code> Nenhuma permissão</li><li><code>1</code> pode executar</li><li><code>2</code> pode escrever</li><li><code>3</code> pode escrever, executar</li><li><code>4</code> pode ler</li><li><code>5</code> pode ler, executar</li><li><code>6</code> pode ler e escrever</li><li><code>7</code> pode ler, escrever e executar</li></ul><p>Nós os usamos em grupos de 3, para definir as permissões de todos os 3 grupos ao todo:</p><pre><code>chmod 777 nome_do_arquivo
chmod 755 nome_do_arquivo
chmod 644 nome_do_arquivo</code></pre><h2 id="o-comando-umask-no-linux"><strong>O comando <code>umask</code> no Linux</strong></h2><p>Ao criar um arquivo, você não precisa decidir as permissões antecipadamente. As permissões têm padrões.</p><p>Esses padrões podem ser controlados e modificados usando o comando <code>umask</code> .</p><p>Digitar <code>umask</code> sem argumentos mostrará o umask, atual, neste caso <code>0022</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-09.04.19-1.png" class="kg-image" alt="Screen-Shot-2020-09-04-at-09.04.19-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-04-at-09.04.19-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-09.04.19-1.png 617w" width="617" height="264" loading="lazy"></figure><p>O que <code>0022</code> significa? Esse é um valor octal que representa as permissões.</p><p>Outro valor comum é <code>0002</code>.</p><p>Use <code>umask -S</code> para ver uma notação legível por humanos:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-09.08.18-1.png" class="kg-image" alt="Screen-Shot-2020-09-04-at-09.08.18-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-04-at-09.08.18-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-09.08.18-1.png 617w" width="617" height="264" loading="lazy"></figure><p>Neste caso, o usuário (<code>u</code>), proprietário do arquivo, possui permissões de leitura, escrita e execução nos arquivos.</p><p>Os demais usuários pertencentes ao mesmo grupo (<code>g</code>) possuem permissão de leitura e execução, igual a todos os demais usuários (<code>o</code>).</p><p>Na notação numérica, normalmente alteramos os últimos 3 dígitos.</p><p>Aqui está uma lista que dá um significado ao número:</p><ul><li><code>0</code> ler, escrever, executar</li><li><code>1</code> ler e escrever</li><li><code>2</code> ler e executar</li><li><code>3</code> somente leitura</li><li><code>4</code> escrever e executar</li><li><code>5</code> escrever apenas</li><li><code>6</code> executar apenas</li><li><code>7</code> nenhuma permissão</li></ul><p>Observe que esta notação numérica difere daquela que usamos em <code>chmod</code>.</p><p>Podemos definir um novo valor para a máscara definindo o valor em formato numérico:</p><pre><code class="language-bash">umask 002</code></pre><p>ou você pode alterar a permissão de uma função específica:</p><pre><code class="language-bash">umask g+r</code></pre><h2 id="o-comando-du-no-linux"><strong>O comando <code>du</code> no Linux</strong></h2><p>O comando <code>du</code> calculará o tamanho de um diretório como um todo:</p><pre><code class="language-bash">du</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-08.11.30-1.png" class="kg-image" alt="Screen-Shot-2020-09-04-at-08.11.30-1" width="540" height="264" loading="lazy"></figure><p>O número <code>32</code> aqui é um valor expresso em bytes.</p><p>Rodar <code>du *</code> calculará o tamanho de cada arquivo individualmente:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-08.12.35-1.png" class="kg-image" alt="Screen-Shot-2020-09-04-at-08.12.35-1" width="540" height="289" loading="lazy"></figure><p>Você pode definir <code>du</code> para exibir valores em MegaBytes, usando <code>du -m</code>, e GigaBytes, usando <code>du -g</code>.</p><p>A opção <code>-h</code> mostrará uma notação legível para tamanhos, adaptando-se ao tamanho:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-08.14.40-1.png" class="kg-image" alt="Screen-Shot-2020-09-04-at-08.14.40-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-04-at-08.14.40-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-08.14.40-1.png 760w" sizes="(min-width: 720px) 720px" width="760" height="389" loading="lazy"></figure><p>Adicionar a opção <code>-a</code> também imprimirá o tamanho de cada arquivo nos diretórios:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-08.20.12-1.png" class="kg-image" alt="Screen-Shot-2020-09-04-at-08.20.12-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-04-at-08.20.12-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-08.20.12-1.png 837w" sizes="(min-width: 720px) 720px" width="837" height="489" loading="lazy"></figure><p>Uma coisa útil é classificar os diretórios por tamanho:</p><pre><code>du -h &lt;diretório&gt; | sort -nr</code></pre><p>‌Em seguida, use <code>head</code> para obter apenas os 10 primeiros resultados:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-08.22.25-1.png" class="kg-image" alt="Screen-Shot-2020-09-04-at-08.22.25-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-04-at-08.22.25-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-08.22.25-1.png 815w" sizes="(min-width: 720px) 720px" width="815" height="464" loading="lazy"></figure><h2 id="o-comando-df-no-linux"><strong>O comando <code>df</code> no &nbsp;Linux</strong></h2><p>O comando <code>df</code> é usado para obter informações de uso do disco.</p><p>Em sua forma básica, ele imprimirá informações sobre os volumes montados:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-08-at-08.40.39-1.png" class="kg-image" alt="Screen-Shot-2020-09-08-at-08.40.39-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-08-at-08.40.39-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screen-Shot-2020-09-08-at-08.40.39-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-08-at-08.40.39-1.png 1288w" sizes="(min-width: 720px) 720px" width="1288" height="364" loading="lazy"></figure><p>Usar a opção <code>-h</code> &nbsp;(<code>df -h</code>) mostrará esses valores em um formato legível:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-08-at-08.40.50-1.png" class="kg-image" alt="Screen-Shot-2020-09-08-at-08.40.50-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-08-at-08.40.50-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screen-Shot-2020-09-08-at-08.40.50-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-08-at-08.40.50-1.png 1222w" sizes="(min-width: 720px) 720px" width="1222" height="364" loading="lazy"></figure><p>Você também pode especificar um nome de arquivo ou diretório para obter informações sobre o volume específico em que ele reside:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-08-at-08.41.27-1.png" class="kg-image" alt="Screen-Shot-2020-09-08-at-08.41.27-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-08-at-08.41.27-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screen-Shot-2020-09-08-at-08.41.27-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-08-at-08.41.27-1.png 1321w" sizes="(min-width: 720px) 720px" width="1321" height="289" loading="lazy"></figure><h2 id="o-comando-basename-no-linux"><strong>O comando <code>basename</code> no Linux</strong></h2><p>Suponha que você tenha um caminho para um arquivo, por exemplo <code>/Users/flavio/test.txt</code>.</p><p>Rodar</p><pre><code class="language-bash">basename /Users/flavio/test.txt</code></pre><p>retornará a string <code>test.txt</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-10-at-08.27.52-1.png" class="kg-image" alt="Screen-Shot-2020-09-10-at-08.27.52-1" width="584" height="264" loading="lazy"></figure><p>Se você executar <code>basename</code> em uma string de caminho que aponta para um diretório, obterá o último segmento do caminho. Neste exemplo, <code>/Users/flavio</code> é um diretório:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-10-at-08.28.11-1.png" class="kg-image" alt="Screen-Shot-2020-09-10-at-08.28.11-1" width="584" height="264" loading="lazy"></figure><h2 id="o-comando-dirname-no-linux"><strong>O comando <code>dirname</code> no Linux</strong></h2><p>Suponha que você tenha um caminho para um arquivo, por exemplo <code>/Users/flavio/test.txt</code>.</p><p>Rodar</p><pre><code class="language-bash">dirname /Users/flavio/test.txt</code></pre><p>retornará a string <code>/Users/flavio</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-10-at-08.31.08-1-1.png" class="kg-image" alt="Screen-Shot-2020-09-10-at-08.31.08-1-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-10-at-08.31.08-1-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-10-at-08.31.08-1-1.png 606w" width="606" height="264" loading="lazy"></figure><h2 id="o-comando-ps-no-linux"><strong>O comando <code>ps</code> no Linux</strong></h2><p>Seu computador está executando vários processos diferentes o tempo todo.</p><p>Você pode inspecionar todos eles usando o comando <code>ps</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-02-at-12.25.08-1.png" class="kg-image" alt="Screen-Shot-2020-09-02-at-12.25.08-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-02-at-12.25.08-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-02-at-12.25.08-1.png 815w" sizes="(min-width: 720px) 720px" width="815" height="439" loading="lazy"></figure><p>Essa é a lista de processos iniciados pelo usuário em execução na sessão atual.</p><p>Aqui eu tenho algumas instâncias de <code>fish</code> shell, a maioria abertas pelo VS Code dentro do editor, e uma instância de Hugo executando a visualização de desenvolvimento de um site.</p><p>Esses são apenas os comandos atribuídos ao usuário atual. Para listar <strong>todos</strong> os processos precisamos passar algumas opções para os <code>ps</code>.</p><p>O mais comum que <strong>eu</strong> uso é o <code>ps ax</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-02-at-12.26.00-1.png" class="kg-image" alt="Screen-Shot-2020-09-02-at-12.26.00-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-02-at-12.26.00-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screen-Shot-2020-09-02-at-12.26.00-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-02-at-12.26.00-1.png 1068w" sizes="(min-width: 720px) 720px" width="1068" height="739" loading="lazy"></figure><blockquote><em>O opção<em> <code>a</code> </em>também é usada para listar os processos de outros usuários, não apenas os seus.<em> <code>x</code> </em>mostra processos não vinculados a nenhum terminal (não iniciados pelos usuários através de um terminal).</em></blockquote><p>Como você pode ver, os comandos mais longos são cortados. Use o comando <code>ps axww</code> para continuar a listagem de comandos em uma nova linha em vez de cortá-la:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-02-at-12.30.22-1.png" class="kg-image" alt="Screen-Shot-2020-09-02-at-12.30.22-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-02-at-12.30.22-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screen-Shot-2020-09-02-at-12.30.22-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-02-at-12.30.22-1.png 1046w" sizes="(min-width: 720px) 720px" width="1046" height="664" loading="lazy"></figure><blockquote>Precisamos especificar<em><em> <code>w</code> 2 </em></em>vezes para aplicar esta configuração (não é um erro de digitação)<em><em>.</em></em></blockquote><p>Você pode procurar um processo específico combinando <code>grep</code> com um <em>pipe</em>, assim:</p><pre><code class="language-bash">ps axww | grep "Visual Studio Code"</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-02-at-12.33.45-1.png" class="kg-image" alt="Screen-Shot-2020-09-02-at-12.33.45-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-02-at-12.33.45-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screen-Shot-2020-09-02-at-12.33.45-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-02-at-12.33.45-1.png 1046w" sizes="(min-width: 720px) 720px" width="1046" height="664" loading="lazy"></figure><p>As colunas retornadas por <code>ps</code> representam algumas informações importantes.</p><p>A primeira informação é o <code>PID</code>, o ID do processo. Isso é fundamental quando você deseja fazer referência a esse processo em outro comando, por exemplo, para eliminá-lo.</p><p>Então temos <code>TT</code> que nos informa o ID do terminal usado.</p><p>Então <code>STAT</code> nos informa o estado do processo:</p><p><code>I</code> um processo que está ocioso (suspenso por mais de 20 segundos)‌‌<code>R</code> um processo executável‌‌<code>S</code> um processo que está dormindo por menos de 20 segundos‌‌<code>T</code> um processo parado‌‌<code>U</code> um processo em espera ininterrupto‌‌<code>Z</code> um processo morto (um zumbi)</p><p>Se você tiver mais de uma carta, a segunda representa mais informações, que podem ser muito técnicas.</p><p>É comum ter <code>+</code> que indica que o processo está em primeiro plano no seu terminal. <code>s</code> significa que o processo é um líder de sessão.</p><p><code>TIME</code> nos diz há quanto tempo o processo está em execução.</p><h2 id="o-comando-top-no-linux"><strong>O comando <code>top</code> no Linux</strong></h2><p>O comando <code>top</code> é usado para exibir informações dinâmicas em tempo real sobre os processos em execução no sistema.</p><p>É muito útil entender o que está acontecendo.</p><p>Seu uso é simples – basta digitar <code>top</code> e o terminal ficará totalmente imerso nesta nova visualização:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-11.39.53-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-11.39.53-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-11.39.53-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screen-Shot-2020-09-03-at-11.39.53-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-11.39.53-1.png 1002w" sizes="(min-width: 720px) 720px" width="1002" height="739" loading="lazy"></figure><p>O processo é demorado. Para sair, você pode digitar a letra <code>q</code> ou <code>ctrl-C</code>.</p><p>Muitas informações nos são fornecidas: o número de processos, quantos estão em execução ou em suspensão, a carga do sistema, o uso da CPU e muito mais.</p><p>Abaixo, a lista de processos que ocupam mais memória e CPU é constantemente atualizada.</p><p>Por padrão, como você pode ver na coluna <code>%CPU</code> destacada, eles são classificados pela CPU usada</p><p>Você pode adicionar um sinalizador para classificar os processos pela memória utilizada:</p><pre><code class="language-bash">top -o mem</code></pre><h2 id="o-comando-kill-no-linux">O comando <code>kill</code> no Linux</h2><p>Os processos do Linux podem receber <strong>sinais</strong> e reagir a eles.</p><p>Essa é uma maneira de interagirmos com programas em execução.</p><p>O programa <code>kill</code> pode enviar uma variedade de sinais para um programa.</p><p>Não é usado apenas para encerrar um programa, como o nome sugere, mas essa é sua função principal.</p><p>Nós o usamos desta maneira:</p><pre><code class="language-bash">kill &lt;PID&gt;</code></pre><p>Por padrão, isso envia o sinal <code>TERM</code> para o ID do processo especificado.</p><p>Podemos usar sinalizadores para enviar outros sinais, incluindo:</p><pre><code class="language-bash">kill -HUP &lt;PID&gt;
kill -INT &lt;PID&gt;
kill -KILL &lt;PID&gt;
kill -TERM &lt;PID&gt;
kill -CONT &lt;PID&gt;
kill -STOP &lt;PID&gt;</code></pre><p>‌<code>HUP</code> significa <strong>desligar</strong>. É enviado automaticamente quando uma janela de terminal que iniciou um processo é fechada antes de encerrar o processo.</p><p><code>INT</code> significa <strong>interrupção</strong> e envia o mesmo sinal usado quando pressionamos <code>ctrl-C</code> no terminal, o que geralmente encerra o processo.</p><p><code>KILL</code> não é enviado para o processo, mas para o kernel do sistema operacional, que imediatamente interrompe e finaliza o processo.</p><p><code>TERM</code> significa <strong>terminar</strong>. O processo vai receber esse sinal e terminar sozinho. É o sinal padrão enviado por <code>kill</code>.</p><p><code>CONT</code> significa <strong>continuar</strong>. Pode ser usado para retomar um processo interrompido.</p><p><code>STOP</code> não é enviado para o processo, mas para o kernel do sistema operacional, que interrompe imediatamente (mas não encerra) o processo.</p><p>Você pode ver números usados, como <code>kill -1 &lt;PID&gt;</code>. Nesse caso,</p><p><code>1</code> corresponde ao <code>HUP</code>.‌‌<code>2</code> corresponde ao <code>INT</code>.‌‌<code>9</code> corresponde ao <code>KILL</code>.‌‌<code>15</code> corresponde ao <code>TERM</code>.‌‌<code>18</code> corresponde ao <code>CONT</code>.‌‌<code>15</code> corresponde ao <code>STOP</code>.</p><h2 id="o-comando-killall-no-linux"><strong>O comando <code>killall</code> no Linux</strong></h2><p>Semelhante ao comando <code>kill</code>, <code>killall</code> enviará o sinal para vários processos ao mesmo tempo, em vez de enviar um sinal para um ID de processo específico.</p><p>Essa é a sintaxe:‌</p><pre><code class="language-bash">killall &lt;nome&gt;</code></pre><p>Aqui, <code>nome</code> é o nome de um programa. Por exemplo, você pode ter várias instâncias do programa <code>top</code> em execução. <code>killall top</code> encerrará todas elas.</p><p>Você pode especificar o sinal, como acontece com <code>kill</code> (e verifique o tutorial <code>kill</code> para ler mais sobre os tipos específicos de sinais que podemos enviar), por exemplo:</p><pre><code class="language-bash">killall -HUP top</code></pre><h2 id="o-comando-jobs-no-linux"><strong>O comando <code>jobs</code> no Linux</strong></h2><p>Quando executamos um comando no Linux/macOS, podemos configurá-lo para execução em segundo plano usando o símbolo <code>&amp;</code> após o comando.</p><p>Por exemplo, podemos executar <code>top</code> em segundo plano:</p><pre><code class="language-bash">top &amp;</code></pre><p>Isso é muito útil para programas de longa duração.</p><p>Podemos voltar a esse programa usando o comando <code>fg</code>. Isso funciona bem se tivermos apenas um trabalho em segundo plano, caso contrário, precisaremos usar o número do trabalho: <code>fg 1</code>, <code>fg 2</code> e assim por diante.</p><p>Para obter o número do trabalho, usamos o comando <code>jobs</code>.</p><p>Digamos que executemos <code>top &amp;</code> e então <code>top -o mem &amp;</code>. Temos 2 instâncias principais em execução. <code>jobs</code> nos mostrará isso:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-11.49.42-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-11.49.42-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-11.49.42-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-11.49.42-1.png 749w" sizes="(min-width: 720px) 720px" width="749" height="289" loading="lazy"></figure><p>Agora, podemos voltar para um daqueles que usam <code>fg &lt;jobid&gt;</code>. Para parar o programa novamente podemos clicar em <code>cmd-Z</code>.</p><p>Executar <code>jobs -l</code> também imprimirá o ID do processo de cada trabalho.</p><h2 id="o-comando-bg-no-linux"><strong>O comando <code>bg</code> no Linux</strong></h2><p>Quando um comando está em execução, você pode suspendê-lo usando <code>ctrl-Z</code>.</p><p>O comando interromperá imediatamente e você retornará ao terminal shell.</p><p>Você pode retomar a execução do comando em segundo plano, para que ele continue em execução, mas não o impeça de realizar outros trabalhos no terminal.</p><p>Neste exemplo, tenho 2 comandos parados:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-16.06.18-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-16.06.18-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-16.06.18-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-16.06.18-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="264" loading="lazy"></figure><p>Posso executar o <code>bg 1</code> para retomar em segundo plano a execução do job nº 1.</p><p>Eu também poderia ter dito <code>bg</code> sem nenhuma opção, pois o padrão é escolher job nº 1 da lista.</p><h2 id="o-comando-fg-no-linux"><strong>O comando <code>fg</code> no Linux</strong></h2><p>Quando um comando está sendo executado em segundo plano, porque você o iniciou com <code>&amp;</code> no final (exemplo: <code>top &amp;</code>) ou porque você o colocou em segundo plano (com o comando <code>bg</code>), você pode colocá-lo em primeiro plano usando <code>fg</code>.</p><p>Executar</p><pre><code class="language-bash">fg</code></pre><p>retomará em primeiro plano o último trabalho que foi suspenso.</p><p>Você também pode especificar qual trabalho deseja retomar para primeiro plano passando o número do trabalho, que pode ser obtido usando o comando <code>jobs</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-16.12.46-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-16.12.46-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-16.12.46-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-16.12.46-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="264" loading="lazy"></figure><p>Executar <code>fg 2</code> retomará o job nº 2:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-16.12.54-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-16.12.54-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-16.12.54-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-16.12.54-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="714" loading="lazy"></figure><h2 id="o-comando-type-no-linux"><strong>O comando <code>type</code> no Linux</strong></h2><p>Um comando pode ser um destes 4 tipos:</p><ul><li>um executável</li><li>um programa embutido no shell</li><li>uma função shell</li><li>um apelido</li></ul><p>O comando <code>type</code> pode ajudar a descobrir isso, caso queiramos saber ou estejamos apenas curiosos. Ele dirá como o comando será interpretado.</p><p>A saída dependerá do shell usado. Este é o Bash:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-16.32.50-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-16.32.50-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-16.32.50-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-16.32.50-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="614" loading="lazy"></figure><p>Este é o Zsh:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-16.32.57-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-16.32.57-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-16.32.57-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-16.32.57-1.png 969w" sizes="(min-width: 720px) 720px" width="969" height="714" loading="lazy"></figure><p>Este é o Fish:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-16.33.06-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-16.33.06-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-16.33.06-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screen-Shot-2020-09-03-at-16.33.06-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-16.33.06-1.png 1002w" sizes="(min-width: 720px) 720px" width="1002" height="1114" loading="lazy"></figure><p>Uma das coisas mais interessantes aqui é que, para aliases, ele dirá para que serve o alias. Você pode ver o <code>ll</code> alias, no caso de Bash e Zsh, mas o Fish o fornece por padrão, então ele dirá que é uma função interna do shell.</p><h2 id="o-comando-which-no-linux"><strong>O comando <code>which</code> no Linux</strong></h2><p>Suponha que você tenha um comando que pode executar porque está no caminho do shell, mas deseja saber onde ele está localizado.</p><p>Você pode fazer isso usando <code>which</code>. O comando retornará o caminho para o comando especificado:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-17.22.47-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-17.22.47-1" width="562" height="289" loading="lazy"></figure><p><code>which</code> funcionará apenas para executáveis armazenados em disco, não para aliases ou funções de shell integradas.</p><h2 id="o-comando-nohup-no-linux"><strong>O comando <code>nohup</code> no Linux</strong></h2><p>Às vezes, você precisa executar um processo de longa duração em uma máquina remota e depois desconectar.</p><p>Ou você, simplesmente, deseja evitar que o comando seja interrompido se houver algum problema de rede entre você e o servidor.</p><p>A maneira de executar um comando mesmo depois de efetuar logout ou fechar a sessão em um servidor é usar o comando <code>nohup</code>.</p><p>Use <code>nohup &lt;comando&gt;</code> para permitir que o processo continue funcionando mesmo depois de você sair.</p><h2 id="o-comando-xargs-no-linux"><strong>O comando <code>xargs</code> no Linux</strong></h2><p>O comando <code>xargs</code> é usado em um shell UNIX para converter a entrada padrão em argumentos para um comando.</p><p>Em outras palavras, através do uso de <code>xargs</code>, a saída de um comando é usada como entrada de outro comando.</p><p>Aqui está a sintaxe que você usará:</p><pre><code>comando1 | xargs comando2</code></pre><p>Usamos um <em>pipe </em>(<code>|</code>) para passar a saída para <code>xargs</code>. Isso cuidará da execução do comando <code>comando2</code>, usando a saída de <code>comando1</code> como seu(s) argumento(s).</p><p>Vamos fazer um exemplo simples. Você deseja remover alguns arquivos específicos de um diretório. Esses arquivos estão listados dentro de um arquivo de texto.</p><p>Temos 3 arquivos: <code>file1</code>, <code>file2</code>, <code>file3</code>.</p><p>No <code>todelete.txt</code> temos uma lista de arquivos que queremos excluir, neste exemplo <code>file1</code> e <code>file3</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-08-at-07.45.28-1.png" class="kg-image" alt="Screen-Shot-2020-09-08-at-07.45.28-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-08-at-07.45.28-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-08-at-07.45.28-1.png 804w" sizes="(min-width: 720px) 720px" width="804" height="314" loading="lazy"></figure><p>Vamos canalizar a saída de <code>cat todelete.txt</code> para o comando <code>rm</code>, através de <code>xargs</code>, assim:</p><pre><code class="language-bash">cat todelete.txt | xargs rm</code></pre><p>Esse é o resultado, os arquivos que listamos agora foram excluídos:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-08-at-07.46.39-1.png" class="kg-image" alt="Screen-Shot-2020-09-08-at-07.46.39-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-08-at-07.46.39-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-08-at-07.46.39-1.png 804w" sizes="(min-width: 720px) 720px" width="804" height="389" loading="lazy"></figure><p>A forma como funciona é que <code>xargs</code> executará <code>rm</code> 2 vezes, uma para cada linha retornada por <code>cat</code>.</p><p>Este é o uso mais simples de <code>xargs</code>. Existem várias opções que podemos usar.</p><p>Um dos mais úteis, na minha opinião (especialmente quando se começa a aprender <code>xargs</code>), é <code>-p</code>. Usar esta opção fará com que o <code>xargs</code> imprima um prompt de confirmação com a ação que será executada:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-08-at-08.19.09-1.png" class="kg-image" alt="Screen-Shot-2020-09-08-at-08.19.09-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-08-at-08.19.09-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-08-at-08.19.09-1.png 606w" width="606" height="264" loading="lazy"></figure><p>A opção <code>-n</code> permite que você diga ao <code>xargs</code> para realizar uma iteração por vez, para que você possa confirmá-las individualmente com <code>-p</code>. Aqui dizemos ao <code>xargs</code> para realizar uma iteração por vez com <code>-n1</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-08-at-08.32.58-1.png" class="kg-image" alt="Screen-Shot-2020-09-08-at-08.32.58-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-08-at-08.32.58-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-08-at-08.32.58-1.png 727w" sizes="(min-width: 720px) 720px" width="727" height="264" loading="lazy"></figure><p>A opção <code>-I</code> é outra amplamente utilizada. Ela permite que você coloque a saída em um espaço reservado e, então, você pode fazer várias coisas.</p><p>Uma delas é executar vários comandos:</p><pre><code>comando1 | xargs -I % /bin/bash -c 'comando2 %; comando3 %</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-08-at-08.35.37-1.png" class="kg-image" alt="Screen-Shot-2020-09-08-at-08.35.37-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-08-at-08.35.37-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-08-at-08.35.37-1.png 859w" sizes="(min-width: 720px) 720px" width="859" height="264" loading="lazy"></figure><blockquote>Você pode trocar o símbolo<em><em> <code>%</code> </em></em>que usei acima por qualquer outra coisa – é uma variável.</blockquote><h2 id="o-comando-do-editor-vim-no-linux"><strong>O comando do editor <code>vim</code> no Linux</strong></h2><p><code>vim</code> é um editor de arquivos <strong>muito</strong> popular, especialmente entre programadores. Ele é desenvolvido ativamente e atualizado com frequência, e há uma grande comunidade em torno dele. Há até uma <a href="https://vimconf.org/">conferência sobre o Vim</a>!</p><p><code>vi</code> em sistemas modernos é apenas um apelido para <code>vim</code>, que significa que <code>vim</code> melhorou.</p><p>Você inicia executando o <code>vi</code> na linha de comando.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-11.44.36-1.png" class="kg-image" alt="Screenshot-2019-02-10-at-11.44.36-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screenshot-2019-02-10-at-11.44.36-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screenshot-2019-02-10-at-11.44.36-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-11.44.36-1.png 1105w" sizes="(min-width: 720px) 720px" width="1105" height="690" loading="lazy"></figure><p>Você pode especificar um nome de arquivo no momento da chamada para editar esse arquivo específico:</p><pre><code class="language-bash">vi test.txt</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-11.36.21-1.png" class="kg-image" alt="Screenshot-2019-02-10-at-11.36.21-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screenshot-2019-02-10-at-11.36.21-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screenshot-2019-02-10-at-11.36.21-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-11.36.21-1.png 1112w" sizes="(min-width: 720px) 720px" width="1112" height="684" loading="lazy"></figure><p>Você deve saber que o Vim possui 2 modos principais:</p><ul><li>modo de comando (ou normal)</li><li>modo de inserção</li></ul><p>Ao iniciar o editor, você está no modo de comando. Você não pode inserir texto como espera de um editor baseado em GUI. Você tem que entrar no<strong> modo de inserção.</strong></p><p>Você pode fazer isso pressionando a tecla <code>i</code>. Depois de fazer isso, a palavra <code>-- INSERT --</code> aparece na parte inferior do editor:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-11.47.39-1.png" class="kg-image" alt="Screenshot-2019-02-10-at-11.47.39-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screenshot-2019-02-10-at-11.47.39-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screenshot-2019-02-10-at-11.47.39-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-11.47.39-1.png 1105w" sizes="(min-width: 720px) 720px" width="1105" height="690" loading="lazy"></figure><p>Agora, você pode começar a digitar e preencher a tela com o conteúdo do arquivo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-11.48.39-1.png" class="kg-image" alt="Screenshot-2019-02-10-at-11.48.39-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screenshot-2019-02-10-at-11.48.39-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screenshot-2019-02-10-at-11.48.39-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-11.48.39-1.png 1105w" sizes="(min-width: 720px) 720px" width="1105" height="690" loading="lazy"></figure><p>Você pode mover-se pelo arquivo com as teclas de seta ou usando as teclas <code>h</code> - <code>j</code> - <code>k</code> - <code>l</code>. <code>h-l</code> para esquerda e direita, <code>j-k</code> para baixo e para cima.</p><p>Quando terminar de editar, você pode pressionar a tecla <code>esc</code> para sair do modo de inserção e voltar ao <strong>modo de comando.</strong></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-11.48.44-1.png" class="kg-image" alt="Screenshot-2019-02-10-at-11.48.44-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screenshot-2019-02-10-at-11.48.44-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screenshot-2019-02-10-at-11.48.44-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-11.48.44-1.png 1105w" sizes="(min-width: 720px) 720px" width="1105" height="690" loading="lazy"></figure><p>Neste ponto, você pode navegar no arquivo, mas não pode adicionar conteúdo a ele (e tome cuidado com as teclas que você pressiona, pois podem ser comandos).</p><p>Uma coisa que você pode querer fazer agora é <strong>salvar o arquivo</strong>. Você pode fazer isso pressionando: (dois pontos) e <code>w</code>.</p><p>Você pode <strong>salvar e sair</strong> pressionando <code>:</code>, <code>w</code> e <code>q</code>: <code>:wq</code></p><p>Você pode <strong>sair sem salvar</strong> pressionando <code>:</code>, <code>q</code> e <code>!</code>: <code>:q!</code></p><p>Você pode <strong>desfazer</strong> e editar acessando o modo de comando e pressionando <code>u</code>. Você pode <strong>refazer</strong> (cancelar um desfazer) pressionando <code>ctrl-r</code>.</p><p>Esses são os princípios básicos para trabalhar com o Vim. A partir daqui começa uma infinitude de informações na qual não podemos entrar nesta pequena introdução.</p><p>Mencionarei apenas os comandos que ajudarão você a começar a editar com o Vim:</p><ul><li>pressionar a tecla <code>x</code> exclui o caractere atualmente destacado</li><li>pressionar <code>A</code> vai para o final da linha atualmente selecionada</li><li>pressionar <code>0</code> para ir para o início da linha</li><li>ir para o primeiro caractere de uma palavra e pressionar <code>d</code> seguido de <code>w</code> para excluir essa palavra. Se você seguir com <code>e</code> em vez de <code>w</code>, o espaço em branco antes da próxima palavra será preservado</li><li>usar um número entre <code>d</code> e <code>w</code> para excluir mais de 1 palavra – por exemplo, usar <code>d3w</code> para excluir 3 palavras adiante</li><li>pressionar <code>d</code> seguido de <code>d</code> para excluir uma linha inteira. Pressionar <code>d</code> seguido de <code>$</code> para deletar toda a linha de onde está o cursor, até o final</li></ul><p>Para saber mais sobre o Vim, recomendo o <a href="https://vimhelp.org/vim_faq.txt.html">FAQ do Vim</a> (em inglês). Você também pode executar o comando <code>vimtutor</code>, que já deve estar instalado em seu sistema e o ajudará muito a iniciar a exploração do <code>vim</code>.</p><h2 id="o-comando-do-editor-emacs-no-linux"><strong>O comando do editor <code>emacs</code> no Linux</strong></h2><p><code>emacs</code> é um editor incrível e é historicamente considerado o editor de sistemas UNIX. Notoriamente, as guerras violentas entre <code>vi</code> e <code>emacs</code> e discussões acaloradas causaram muitas horas improdutivas para desenvolvedores em todo o mundo.</p><p><code>emacs</code> é muito poderoso. Algumas pessoas usam esse editor o dia todo como uma espécie de sistema operacional (<a href="https://news.ycombinator.com/item?id=19127258">https://news.ycombinator.com/item?id=19127258</a>). Falaremos apenas sobre o básico aqui.</p><p>Você pode abrir uma nova sessão do emacs simplesmente invocando <code>emacs</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-12.14.18-1.png" class="kg-image" alt="Screenshot-2019-02-10-at-12.14.18-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screenshot-2019-02-10-at-12.14.18-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screenshot-2019-02-10-at-12.14.18-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-12.14.18-1.png 1105w" sizes="(min-width: 720px) 720px" width="1105" height="786" loading="lazy"></figure><blockquote>Usuários do macOS, parem um segundo agora. Se você estiver no Linux, não há problemas, mas o macOS não fornece aplicativos que usam GPLv3 e todos os comandos integrados do UNIX que foram atualizados para GPLv3 não foram atualizados.‌‌‌‌Embora haja um pequeno problema com os comandos que listei até agora, neste caso, usar uma versão do emacs de 2007 não é exatamente o mesmo que usar uma versão com 12 anos de melhorias e mudanças.‌‌‌‌Esse não é um problema com o Vim, que está atualizado. Para corrigir isso, execute <code>brew install emacs</code> e a execução do <code>emacs</code> usará a nova versão do Homebrew (certifique-se de ter o Homebrew instalado).</blockquote><p>Você também pode editar um arquivo existente chamando <code>emacs &lt;nome_do_arquivo&gt;</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-13.12.49-1.png" class="kg-image" alt="Screenshot-2019-02-10-at-13.12.49-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screenshot-2019-02-10-at-13.12.49-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screenshot-2019-02-10-at-13.12.49-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-13.12.49-1.png 1105w" sizes="(min-width: 720px) 720px" width="1105" height="786" loading="lazy"></figure><p>Agora, você pode começar a editar. Quando terminar, pressione <code>ctrl-x</code> seguido de <code>ctrl-w</code>. Você confirma a pasta:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-13.14.29-1.png" class="kg-image" alt="Screenshot-2019-02-10-at-13.14.29-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screenshot-2019-02-10-at-13.14.29-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screenshot-2019-02-10-at-13.14.29-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-13.14.29-1.png 1105w" sizes="(min-width: 720px) 720px" width="1105" height="786" loading="lazy"></figure><p>O Emacs informa que o arquivo existe, perguntando se ele deve ser sobrescrito:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-13.14.32-1.png" class="kg-image" alt="Screenshot-2019-02-10-at-13.14.32-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screenshot-2019-02-10-at-13.14.32-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screenshot-2019-02-10-at-13.14.32-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-13.14.32-1.png 1105w" sizes="(min-width: 720px) 720px" width="1105" height="786" loading="lazy"></figure><p>Responda <code>y</code> e você receberá uma confirmação de sucesso:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-13.14.35-1.png" class="kg-image" alt="Screenshot-2019-02-10-at-13.14.35-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screenshot-2019-02-10-at-13.14.35-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screenshot-2019-02-10-at-13.14.35-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-13.14.35-1.png 1105w" sizes="(min-width: 720px) 720px" width="1105" height="786" loading="lazy"></figure><p>Você pode sair do Emacs pressionando <code>ctrl-x</code> seguido de <code>ctrl-c</code>.‌‌Como opção, use <code>ctrl-x</code> seguido de <code>c</code> (mantenha <code>ctrl</code> pressionado).</p><p>Há muito para saber sobre o Emacs, certamente mais do que sou capaz de escrever nesta pequena introdução. Eu encorajo você a abrir o Emacs e pressionar <code>ctrl-h</code> <code>r</code> para abrir o manual integrado e <code>ctrl-h</code> <code>t</code> para abrir o tutorial oficial.</p><h2 id="o-comando-do-editor-nano-no-linux"><strong>O comando do editor <code>nano</code> no Linux</strong></h2><p><code>nano</code> é um editor amigável para iniciantes.</p><p>Execute-o usando <code>nano &lt;nome_do_arquivo&gt;</code>.</p><p>Você pode digitar caracteres diretamente no arquivo sem se preocupar com os modos.</p><p>Você pode sair sem editar usando <code>ctrl-X</code>. Se você editou o buffer do arquivo, o editor solicitará sua confirmação e você poderá salvar as edições ou descartá-las.</p><p>A ajuda na parte inferior mostra os comandos do teclado que permitem trabalhar com o arquivo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-11.03.51-1.png" class="kg-image" alt="Screenshot-2019-02-10-at-11.03.51-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screenshot-2019-02-10-at-11.03.51-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screenshot-2019-02-10-at-11.03.51-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screenshot-2019-02-10-at-11.03.51-1.png 1203w" sizes="(min-width: 720px) 720px" width="1203" height="736" loading="lazy"></figure><p><code>pico</code> é mais ou menos igual, embora <code>nano</code> é a versão GNU do <code>pico</code> que em algum momento da história não era de código aberto. O <code>nano</code> clone foi feito para satisfazer os requisitos de licença do sistema operacional GNU.</p><h2 id="o-comando-whoami-no-linux"><strong>O comando <code>whoami</code> no Linux</strong></h2><p>Digite <code>whoami</code> para imprimir o nome do usuário atualmente conectado à sessão do terminal:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.08.05-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-18.08.05-1" width="507" height="264" loading="lazy"></figure><blockquote>Observação: esse comando é diferente do comando<em><em> <code>who am i</code></em>, </em>que imprime mais informações</blockquote><h2 id="o-comando-who-no-linux"><strong>O comando <code>who</code> no Linux</strong></h2><p>O comando <code>who</code> exibe os usuários logados no sistema.</p><p>A menos que você esteja usando um servidor ao qual várias pessoas têm acesso, é provável que você seja o único usuário conectado, várias vezes:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.03.05-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-18.03.05-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-18.03.05-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.03.05-1.png 705w" width="705" height="314" loading="lazy"></figure><p>Por que várias vezes? Porque cada shell aberto contará como um acesso.</p><p>Você pode ver o nome do terminal utilizado e a hora/dia em que a sessão foi iniciada.</p><p>Os sinalizadores <code>-aH</code> dirão <code>who</code> exibirá mais informações, incluindo o tempo ocioso e o ID do processo do terminal:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.05.29-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-18.05.29-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-18.05.29-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.05.29-1.png 848w" sizes="(min-width: 720px) 720px" width="848" height="514" loading="lazy"></figure><p>O comando especial <code>who am i</code> listará os detalhes atuais da sessão do terminal:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.06.35-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-18.06.35-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-18.06.35-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.06.35-1.png 617w" width="617" height="264" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.07.30-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-18.07.30-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-18.07.30-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.07.30-1.png 837w" sizes="(min-width: 720px) 720px" width="837" height="264" loading="lazy"></figure><h2 id="o-comando-su-no-linux"><strong>O comando <code>su</code> no Linux</strong></h2><p>Enquanto você estiver conectado ao shell do terminal com um usuário, pode ser necessário mudar para outro usuário.</p><p>Por exemplo, você está logado como root para realizar alguma manutenção, mas deseja mudar para uma conta de usuário.</p><p>Você pode fazer isso com o comando <code>su</code>:</p><pre><code>su &lt;nome_de_usuário&gt;</code></pre><p>Por exemplo: <code>su flavio</code>.</p><p>Se você estiver logado como usuário, executar <code>su</code> sem mais nada solicitará que você insira a senha do usuário <code>root</code>, pois esse é o comportamento padrão.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.18.09-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-18.18.09-1" width="562" height="289" loading="lazy"></figure><p><code>su</code> iniciará um novo shell como outro usuário.</p><p>Quando terminar, digitar <code>exit</code> no shell fechará esse shell e retornará ao shell do usuário atual.</p><h2 id="o-comando-sudo-no-linux"><strong>O comando <code>sudo</code> no Linux</strong></h2><p><code>sudo</code> é comumente usado para executar um comando como root.</p><p>Você deve estar habilitado para usar o <code>sudo</code> e, quando estiver, poderá executar comandos como root digitando a senha do seu usuário (não a senha do usuário root).</p><p>As permissões são altamente configuráveis, o que é ótimo especialmente em um ambiente de servidor multiusuário. Alguns usuários podem ter acesso para executar comandos específicos por meio de <code>sudo</code>.</p><p>Por exemplo, você pode editar um arquivo de configuração do sistema:</p><pre><code class="language-bash">sudo nano /etc/hosts</code></pre><p>De outra forma, isso não seria salvo, pois você não tem a permissão para isso.</p><p>Você pode executar <code>sudo -i</code> para iniciar um shell como root:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.25.50-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-18.25.50-1" width="584" height="289" loading="lazy"></figure><p>Você pode usar <code>sudo</code> para executar comandos como qualquer usuário. <code>root</code> é o padrão, mas use a opção <code>-u</code> para especificar outro usuário:</p><pre><code class="language-bash">sudo -u flavio ls /Users/flavio</code></pre><h2 id="o-comando-passwd-no-linux"><strong>O comando <code>passwd</code> no Linux</strong></h2><p>Os usuários do Linux têm uma senha atribuída. Você pode alterar a senha usando o comando <code>passwd</code>.</p><p>Existem duas situações aqui.</p><p>A primeira é quando você deseja alterar sua senha. Neste caso, você digita:</p><pre><code class="language-bash">passwd</code></pre><p>e um prompt interativo solicitará a senha antiga e, em seguida, solicitará a nova:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-07.32.05-1.png" class="kg-image" alt="Screen-Shot-2020-09-04-at-07.32.05-1" width="507" height="264" loading="lazy"></figure><p>Quando você é <code>root</code> (ou tem privilégios de superusuário), você pode definir o nome de usuário para o qual deseja alterar a senha:</p><pre><code>passwd &lt;usuário&gt; &lt;nova_senha&gt;</code></pre><p>Neste caso, você não precisa inserir a antiga.</p><h2 id="o-comando-ping-no-linux"><strong>O comando <code>ping</code> no Linux</strong></h2><p>O comando <code>ping</code> faz ping em um host de rede específico, na rede local ou na Internet.</p><p>Você o usa com a sintaxe <code>ping &lt;host&gt;</code>, onde <code>&lt;host&gt;</code> pode ser um nome de domínio ou um endereço IP.</p><p>Aqui está um exemplo de ping <code>google.com</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-15.21.46-1.png" class="kg-image" alt="Screen-Shot-2020-09-09-at-15.21.46-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-09-at-15.21.46-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-15.21.46-1.png 914w" sizes="(min-width: 720px) 720px" width="914" height="464" loading="lazy"></figure><p>O comando envia uma solicitação ao servidor e o servidor retorna uma resposta.</p><p><code>ping</code> continua enviando a solicitação a cada segundo, por padrão. Ele continuará funcionando até você pará-lo com <code>ctrl-C</code>, a menos que você passe o número de vezes que deseja tentar com a opção <code>-c</code>: <code>ping -c 2 google.com</code>.</p><p>Assim que o <code>ping</code> for interrompido, ele imprimirá algumas estatísticas sobre os resultados: a porcentagem de pacotes perdidos e estatísticas sobre o desempenho da rede.</p><p>Como você pode ver, a tela imprime o endereço IP do host e o tempo que levou para obter a resposta.</p><p>Nem todos os servidores suportam ping, caso a solicitação expire:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-15.21.27-1.png" class="kg-image" alt="Screen-Shot-2020-09-09-at-15.21.27-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-09-at-15.21.27-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-15.21.27-1.png 914w" sizes="(min-width: 720px) 720px" width="914" height="414" loading="lazy"></figure><p>Às vezes isso, é feito propositalmente, para "ocultar" o servidor ou apenas para reduzir a carga. Os pacotes de ping também podem ser filtrados por firewalls.</p><p><code>ping</code> funciona usando o <strong>protocolo ICMP</strong> (Internet Control Message Protocol), um protocolo de camada de rede como TCP ou UDP.</p><p>A solicitação envia um pacote ao servidor com a mensagem <code>ECHO_REQUEST</code> e o servidor retorna uma mensagem <code>ECHO_REPLY</code>. Não vou entrar em detalhes, mas esse é o conceito básico.</p><p>Fazer ping em um host é útil para saber se o host está acessível (supondo que ele implemente o ping), assim como a distância que ele está em termos de quanto tempo leva para retornar para você.</p><p>Normalmente, quanto mais próximo o servidor estiver geograficamente, menos tempo levará para retornar para você. Leis físicas simples fazem com que uma distância maior introduza mais atraso nos cabos.</p><h2 id="o-comando-traceroute-no-linux"><strong>O comando <code>traceroute</code> no Linux</strong></h2><p>Ao tentar acessar um host na Internet, você passa pelo roteador doméstico. Então você chega à rede do seu ISP, que por sua vez passa por seu próprio roteador de rede upstream e assim por diante, até finalmente chegar ao host.</p><p>Você já quis saber quais etapas seus pacotes passam para fazer isso?</p><p>O comando <code>traceroute</code> é feito para isso.</p><p>Você chama</p><pre><code class="language-bash">traceroute &lt;host&gt;</code></pre><p>Ele vai reunir (lentamente) todas as informações enquanto o pacote viaja.</p><p>Neste exemplo, tentei acessar meu blog com <code>traceroute flaviocopes.com</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-16.32.01-1.png" class="kg-image" alt="Screen-Shot-2020-09-09-at-16.32.01-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-09-at-16.32.01-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screen-Shot-2020-09-09-at-16.32.01-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-16.32.01-1.png 1123w" sizes="(min-width: 720px) 720px" width="1123" height="639" loading="lazy"></figure><p>Nem todo roteador percorrido nos retorna informações. Neste caso, <code>traceroute</code> imprime <code>* * *</code>. Caso contrário, podemos ver o nome do host, o endereço IP e alguns indicadores de desempenho.</p><p>Para cada roteador, podemos ver 3 amostras, o que significa que o traceroute tenta, por padrão, 3 vezes obter uma boa indicação do tempo necessário para alcançá-lo.</p><p>É por isso que leva tanto tempo para executar o <code>traceroute</code> em comparação com simplesmente fazer um <code>ping</code> naquele host.</p><p>Você pode personalizar esse número com a opção <code>-q</code>:</p><pre><code class="language-bash">traceroute -q 1 flaviocopes.com</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-16.36.07-1.png" class="kg-image" alt="Screen-Shot-2020-09-09-at-16.36.07-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-09-at-16.36.07-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screen-Shot-2020-09-09-at-16.36.07-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-16.36.07-1.png 1068w" sizes="(min-width: 720px) 720px" width="1068" height="564" loading="lazy"></figure><h2 id="o-comando-clear-no-linux"><strong>O comando <code>clear</code> no Linux</strong></h2><p>Digite <code>clear</code> para limpar todos os comandos anteriores que foram executados no terminal atual.</p><p>A tela será limpa e você verá apenas o prompt na parte superior:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.10.32-1.png" class="kg-image" alt="Screen-Shot-2020-09-03-at-18.10.32-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-03-at-18.10.32-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-03-at-18.10.32-1.png 738w" sizes="(min-width: 720px) 720px" width="738" height="389" loading="lazy"></figure><blockquote>Observação: este comando possui um atalho útil: <em><em><code>ctrl-L</code></em></em></blockquote><p>Depois de fazer isso, você perderá o acesso à rolagem para ver a saída dos comandos inseridos anteriormente.</p><p>Portanto, você pode querer usar <code>clear -x</code> que ainda limpa a tela, mas permite voltar para ver o trabalho anterior rolando para cima.</p><h2 id="o-comando-history-no-linux"><strong>O comando <code>history</code> no Linux</strong></h2><p>Cada vez que você executa um comando, ele é memorizado no histórico.</p><p>Você pode exibir todo o histórico usando:</p><pre><code class="language-bash">history</code></pre><p>Isso mostra a história com números:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-08.03.10-1.png" class="kg-image" alt="Screen-Shot-2020-09-04-at-08.03.10-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-04-at-08.03.10-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-08.03.10-1.png 903w" sizes="(min-width: 720px) 720px" width="903" height="539" loading="lazy"></figure><p>Você pode usar a sintaxe <code>!&lt;comando número&gt;</code> para repetir um comando armazenado no histórico. No exemplo acima, digitar <code>!121</code> repetirá <code>ls -al | wc -l</code>.</p><p>Normalmente, os últimos 500 comandos são armazenados no histórico.</p><p>Você pode combinar isso com <code>grep</code> para encontrar um comando que você executou</p><pre><code class="language-bash">history | grep docker</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-08.04.50-1.png" class="kg-image" alt="Screen-Shot-2020-09-04-at-08.04.50-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-04-at-08.04.50-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-04-at-08.04.50-1.png 903w" sizes="(min-width: 720px) 720px" width="903" height="339" loading="lazy"></figure><p>Para limpar o histórico, execute <code>history -c</code>.</p><h2 id="o-comando-export-no-linux"><strong>O comando <code>export</code> no Linux</strong></h2><p>O comando <code>export</code> é usado para exportar variáveis para processos filhos.</p><p>O que isso significa?</p><p>Suponha que você tenha uma variável TEST definida assim:</p><pre><code class="language-bash">TEST="test"</code></pre><p>Você pode imprimir seu valor usando <code>echo $TEST</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-17.32.49-1.png" class="kg-image" alt="Screen-Shot-2020-09-09-at-17.32.49-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-09-at-17.32.49-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-17.32.49-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="264" loading="lazy"></figure><p>No entanto, você pode tentar definir um script Bash em um arquivo <code>script.sh</code> com o comando acima:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-17.35.23-1.png" class="kg-image" alt="Screen-Shot-2020-09-09-at-17.35.23-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-09-at-17.35.23-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-17.35.23-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="439" loading="lazy"></figure><p>Ao definir <code>chmod u+x script.sh</code> e executar este script com <code>./script.sh</code>, a linha <code>echo $TEST</code> não imprimirá nada!</p><p>Isso ocorre porque, no Bash, a variável <code>TEST</code> foi definida localmente no shell. Ao executar um script de shell ou outro comando, um subshell é iniciado para executá-lo, que não contém as variáveis locais do shell atuais.</p><p>Para disponibilizar a variável ali precisamos definir <code>TEST</code> não assim:</p><pre><code class="language-bash">TEST="test"</code></pre><p>Defina-o assim:</p><pre><code class="language-bash">export TEST="test"</code></pre><p>Tente isso e execute <code>./script.sh</code>. Agora, ele deve imprimir "test":</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-17.37.56-1.png" class="kg-image" alt="Screen-Shot-2020-09-09-at-17.37.56-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-09-at-17.37.56-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-17.37.56-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="289" loading="lazy"></figure><p>Às vezes, você precisa acrescentar algo a uma variável. Geralmente, isso é feito com a variável <code>PATH</code>. Você usa esta sintaxe:</p><pre><code class="language-bash">export PATH=$PATH:/new/path</code></pre><p>É comum usar <code>export</code> quando você cria variáveis dessa maneira. Você, contudo, também pode usá-lo ao criar variáveis nos arquivos de configuração <code>.bash_profile</code> ou <code>.bashrc</code> com Bash, ou em <code>.zshenv</code> com Zsh.</p><p>Para remover uma variável, use a opção <code>-n</code>:</p><pre><code class="language-bash">export -n TEST</code></pre><p>Chamar <code>export</code> sem qualquer opção listará todas as variáveis exportadas.</p><h2 id="o-comando-crontab-no-linux"><strong>O comando <code>crontab</code> no Linux</strong></h2><p><em>Cron jobs</em> são jobs agendados para execução em intervalos específicos. Você pode fazer com que um comando execute algo a cada hora, todos os dias, a cada 2 semanas ou nos finais de semana.</p><p>Eles são muito poderosos, principalmente quando usados em servidores para realizar manutenções e automações.</p><p>O comando <code>crontab</code> é o ponto de entrada para trabalhar com tarefas cron.</p><p>A primeira coisa que você pode fazer é explorar quais <em>cron jobs</em> são definidos por você:</p><pre><code class="language-bash">crontab -l</code></pre><p>Você pode não ter nenhum, como eu:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-17.54.31-1.png" class="kg-image" alt="Screen-Shot-2020-09-09-at-17.54.31-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-09-at-17.54.31-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-17.54.31-1.png 804w" sizes="(min-width: 720px) 720px" width="804" height="314" loading="lazy"></figure><p>Execute</p><pre><code class="language-bash">crontab -e</code></pre><p>para editar os cron jobs e adicionar novos.</p><p>Por padrão, isso abre com o editor padrão, que geralmente é o <code>vim</code>. Eu gosto mais do <code>nano</code>. Você pode usar esta linha para usar um editor diferente:</p><pre><code class="language-bash">EDITOR=nano crontab -e</code></pre><p>Agora, você pode adicionar uma linha para cada cron job.</p><p>A sintaxe para definir cron jobs é meio assustadora. É por isso que costumo usar um site para me ajudar a gerá-los sem erros: <a href="https://crontab-generator.org/">https://crontab-generator.org/</a></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-18.03.57-1.png" class="kg-image" alt="Screen-Shot-2020-09-09-at-18.03.57-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-09-at-18.03.57-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/06/Screen-Shot-2020-09-09-at-18.03.57-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-18.03.57-1.png 1233w" sizes="(min-width: 720px) 720px" width="1233" height="1364" loading="lazy"></figure><p>Você escolhe um intervalo de tempo para o cron job e digita o comando a ser executado.</p><p>Optei por executar um script localizado em <code>/Users/flavio/test.sh</code> a cada 12 horas. Esta é a linha crontab que preciso executar:</p><pre><code class="language-txt">* */12 * * * /Users/flavio/test.sh &gt;/dev/null 2&gt;&amp;1</code></pre><p>Eu executo <code>crontab -e</code>:</p><pre><code class="language-bash">EDITOR=nano crontab -e</code></pre><p>e adiciono essa linha. Então, pressiono <code>ctrl-X</code> e pressiono <code>y</code> para salvar.</p><p>Se tudo correr bem, o cron job está configurado:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-18.06.19-1.png" class="kg-image" alt="Screen-Shot-2020-09-09-at-18.06.19-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-09-at-18.06.19-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-18.06.19-1.png 804w" sizes="(min-width: 720px) 720px" width="804" height="264" loading="lazy"></figure><p>Feito isso, você pode ver a lista de cron jobs ativos executando:</p><pre><code class="language-bash">crontab -l</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-18.07.00-1.png" class="kg-image" alt="Screen-Shot-2020-09-09-at-18.07.00-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-09-at-18.07.00-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-18.07.00-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="339" loading="lazy"></figure><p>Você pode remover um cron job executando <code>crontab -e</code> novamente, removendo a linha e saindo do editor:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-18.07.40-1.png" class="kg-image" alt="Screen-Shot-2020-09-09-at-18.07.40-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-09-at-18.07.40-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-18.07.40-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="339" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-18.07.49-1.png" class="kg-image" alt="Screen-Shot-2020-09-09-at-18.07.49-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-09-at-18.07.49-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-09-at-18.07.49-1.png 793w" sizes="(min-width: 720px) 720px" width="793" height="339" loading="lazy"></figure><h2 id="o-comando-uname-no-linux"><strong>O comando <code>uname</code> no Linux</strong></h2><p>Chamar <code>uname</code> sem nenhuma opção retornará o codinome do sistema operacional:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.37.41-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-07.37.41-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-07.37.41-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.37.41-1.png 606w" width="606" height="339" loading="lazy"></figure><p>A opção <code>m</code> mostra o nome do hardware (x86_64 neste exemplo) e a opção <code>p</code> imprime o nome da arquitetura do processador (<code>i386</code> neste exemplo):</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.37.51-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-07.37.51-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-07.37.51-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.37.51-1.png 606w" width="606" height="339" loading="lazy"></figure><p>A opção <code>s</code> imprime o nome do sistema operacional. <code>r</code> imprime o lançamento e <code>v</code> imprime a versão:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.37.56-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-07.37.56-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-07.37.56-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.37.56-1.png 606w" width="606" height="339" loading="lazy"></figure><p>A opção <code>n</code> imprime o nome da rede do nó:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.38.01-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-07.38.01-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-07.38.01-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.38.01-1.png 606w" width="606" height="339" loading="lazy"></figure><p>A opção <code>a</code> imprime todas as informações disponíveis:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.38.06-1.png" class="kg-image" alt="Screen-Shot-2020-09-07-at-07.38.06-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-07-at-07.38.06-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-07-at-07.38.06-1.png 606w" width="606" height="339" loading="lazy"></figure><p>No macOS, você também pode usar o comando <code>sw_vers</code> para imprimir mais informações sobre o sistema operacional macOS. Observe que isso difere da versão Darwin (o Kernel), que acima é <code>19.6.0</code>.</p><p>Darwin é o nome do kernel do macOS. O kernel é o "núcleo" do sistema operacional, enquanto o sistema operacional como um todo é chamado de macOS. No Linux, Linux é o kernel, e GNU/Linux seria o nome do sistema operacional (embora todos nos refiramos a ele como "Linux").</p><h2 id="o-comando-env-no-linux"><strong>O comando <code>env</code> no Linux</strong></h2><p>O comando <code>env</code> pode ser usado para passar variáveis de ambiente sem configurá-las no ambiente externo (o shell atual).</p><p>Suponha que você queira executar uma aplicação do Node.js e definir a variável <code>USER</code> para ele.</p><p>Você pode executar</p><pre><code class="language-bash">env USER=flavio node app.js</code></pre><p>e a variável de ambiente <code>USER</code> estará acessível na aplicação do Node.js por meio da interface Node <code>process.env</code>.</p><p>Você também pode executar o comando limpando todas as variáveis de ambiente já definidas, usando a opção <code>-i</code>:</p><pre><code class="language-bash">env -i node app.js</code></pre><p>Nesse caso, você receberá um erro dizendo <code>env: node: No such file or directory</code> porque o comando <code>node</code> não está acessível, pois a variável <code>PATH</code> usada pelo shell para procurar comandos nos caminhos comuns não está definida.</p><p>Então, você precisa passar o caminho completo para o programa <code>node</code>:</p><pre><code class="language-bash">env -i /usr/local/bin/node app.js</code></pre><p>Experimente com um arquivo <code>app.js</code> simples com este conteúdo:</p><pre><code class="language-js">console.log(process.env.NAME)
console.log(process.env.PATH)</code></pre><p>Você verá a saída como</p><pre><code>undefined
undefined</code></pre><p>Você pode passar uma variável env:</p><pre><code class="language-bash">env -i NAME=flavio node app.js</code></pre><p>e a saída será</p><pre><code>flavio
undefined</code></pre><p>A remoção da opção<code>-i</code> tornará o <code>PATH</code> disponível novamente dentro do programa:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-10-at-16.55.17-1.png" class="kg-image" alt="Screen-Shot-2020-09-10-at-16.55.17-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-10-at-16.55.17-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-10-at-16.55.17-1.png 925w" sizes="(min-width: 720px) 720px" width="925" height="264" loading="lazy"></figure><p>O comando <code>env</code> também pode ser usado para imprimir todas as variáveis de ambiente. Se executado sem opções:</p><pre><code class="language-bash">env</code></pre><p>Ele retornará uma lista das variáveis de ambiente definidas, por exemplo:</p><pre><code class="language-txt">HOME=/Users/flavio
LOGNAME=flavio
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin
PWD=/Users/flavio
SHELL=/usr/local/bin/fish</code></pre><p>Você também pode tornar uma variável inacessível dentro do programa que você executa, usando a opção <code>-u</code>. Por exemplo, este código remove a variável <code>HOME</code> do ambiente de comando:</p><pre><code class="language-bash">env -u HOME node app.js</code></pre><h2 id="o-comando-printenv-no-linux"><strong>O comando <code>printenv</code> no Linux</strong></h2><p>Aqui está um guia rápido para o comando <code>printenv</code>, usado para imprimir os valores das variáveis de ambiente</p><p>Em qualquer shell, há um bom número de variáveis de ambiente, definidas pelo sistema ou por seus próprios scripts e configurações de shell.</p><p>Você pode imprimir todos eles no terminal usando o comando <code>printenv</code>. A saída será algo assim:</p><pre><code class="language-txt">HOME=/Users/flavio
LOGNAME=flavio
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin
PWD=/Users/flavio
SHELL=/usr/local/bin/fish</code></pre><p>com mais algumas linhas, geralmente.</p><p>Você pode anexar um nome de variável como parâmetro, para mostrar apenas o valor dessa variável:</p><pre><code class="language-bash">printenv PATH</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-10-at-16.31.20-1.png" class="kg-image" alt="Screen-Shot-2020-09-10-at-16.31.20-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Screen-Shot-2020-09-10-at-16.31.20-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Screen-Shot-2020-09-10-at-16.31.20-1.png 628w" width="628" height="264" loading="lazy"></figure><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>Muito obrigado por ler este manual.</p><p>Espero que ele inspire você a aprender mais sobre o Linux e seus recursos. É um conhecimento perene que não ficará desatualizado tão cedo.</p><p>Lembre-se de que você pode <a href="https://flaviocopes.com/page/linux-commands-handbook/">fazer download deste manual em PDF/ePUB/Mobi </a> se você quiser!</p><p>O autor publica <strong>tutoriais de programação</strong> diariamente em seu site, <a href="https://flaviocopes.com/">flaviocopes.com</a>, se você quiser conferir mais conteúdos excelentes como este.</p><p>Você pode entrar em contato com o autor através do <a href="https://twitter.com/flaviocopes">Twitter</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como integrar mapas no React Native usando react-native-maps ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Mukhamed Khasanza Hoje em dia, quase todas as aplicações para dispositivos móveis têm um recurso de mapas. Eu tive que integrar o Google Maps à minha aplicação para o React Native, e a única opção era o react-native-maps da Airbnb (é o único ainda suportado pela comunidade do ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-integrar-mapas-no-react-native-usando-react-native-maps/</link>
                <guid isPermaLink="false">6671c1bd79dc5c03cfad4203</guid>
                
                    <category>
                        <![CDATA[ React Native ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sabrina ]]>
                </dc:creator>
                <pubDate>Mon, 24 Jun 2024 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/1_qp8QiCRmx0D041XU4qhx4g.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-integrate-maps-in-react-native-using-react-native-maps-5745490fe055/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to integrate maps in React Native using react-native-maps</a>
      </p><p>Escrito por: Mukhamed Khasanza</p><p>Hoje em dia, quase todas as aplicações para dispositivos móveis têm um recurso de mapas. Eu tive que integrar o Google Maps à minha aplicação para o React Native, e a única opção era o react-native-maps da Airbnb (é o único ainda suportado pela comunidade do React Native).</p><p>Encontrei vários tutoriais sobre como configurar essa biblioteca, mas nenhum funcionou totalmente para mim. Isso porque eu tinha que rodar em plataformas iOS e Android, além de dar suporte ao Google Maps para iOS.</p><p>Vamos criar uma aplicação do React Native do zero usando react-native-cli para mostrar, passo a passo, como tudo é instalado. Se você quiser integrar o react-native-maps à sua aplicação existente, pule a <strong>Etapa<strong> 1</strong></strong>.</p><h4 id="etapa-1-instalar-e-configurar-a-aplica-o-do-react-native"><strong>Etapa<strong> 1: </strong>i<strong>nstal</strong>ar e configurar a aplicação do<strong> React Native</strong></strong></h4><p>Se você não instalou a interface de linha de comando do React Native, execute: <code>npm install -g react-native-cli</code>. Agora, você pode criar seu projeto, simplesmente usando: <code>react-native init ReactNativeMaps</code></p><p>Aqui estão as versões de dependência no momento da construção deste projeto:</p><ul><li>"react": "16.6.1"</li><li>"react-native": "0.57.5"</li><li>"react-native-maps": "0.22.1" — instalaremos este mais tarde.</li></ul><blockquote>Nota da tradução: mantivemos as versões constantes no artigo original, mas, na data da tradução, as versões são 18.2.0 e 1.15.6, respectivamente.</blockquote><p>Tente executar sua aplicação, <code>react-native run-ios</code> ou <code>react-native run-android</code>. Normalmente, isso funciona sem problemas.</p><h4 id="etapa-2-adicionar-e-vincular-o-pacote-react-native-maps"><strong>Etapa<strong> 2: </strong>a<strong>d</strong>icionar e vincular o pacote<strong> react-native-maps</strong></strong></h4><p>Agora, vamos instalar o react-native-maps: <code>npm install --save react-native-maps</code>. Depois de instalar o pacote, você deve vinculá-lo às suas aplicações nativas: <code>react-native link react-native-maps</code>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/UIyvyNDxVXBMQeYn9Wno72ob5T8iqR7Cr1c3.png" class="kg-image" alt="UIyvyNDxVXBMQeYn9Wno72ob5T8iqR7Cr1c3" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/UIyvyNDxVXBMQeYn9Wno72ob5T8iqR7Cr1c3.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/UIyvyNDxVXBMQeYn9Wno72ob5T8iqR7Cr1c3.png 800w" sizes="(min-width: 720px) 720px" width="800" height="84" loading="lazy"><figcaption>Se você recebeu uma tela semelhante a essa, podemos continuar.</figcaption></figure><h4 id="etapa-3-configurar-o-apple-maps-ios-"><strong>Etapa<strong> 3: </strong>configurar o<strong> Apple Maps (iOS)</strong></strong></h4><p>Será mais fácil se os configurarmos separadamente por plataforma. Então, vamos primeiro fazer isso no iOS. Antes de integrar o Google Maps, verificaremos se o Apple Maps funciona corretamente. Adicione o seguinte código ao seu componente de renderização atual, onde você deseja renderizar seu MapView.</p><pre><code>import MapView from 'react-native-maps'</code></pre><pre><code>export default class App extends Component&lt;Props&gt; {
  render() {
    return (&lt;MapView style={{flex: 1}} region={{ latitude: 42.882004, longitude: 74.582748, latitudeDelta: 0.0922, longitudeDelta: 0.0421 }} showsUserLocation={true} /&gt;);
  }
}</code></pre><p>Você pode testar qualquer local que quiser. Basta especificar a latitude e a longitude apropriadas. Como você pode ver, eu habilitei a localização do usuário simplesmente adicionando a prop <code>showUserLocation</code> ao componente MapView. Se você estiver executando no dispositivo real, verá sua localização atual.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/qtVkxY6KL4FhpwLUbEbBeqN8o6o7poi1ewRF.png" class="kg-image" alt="qtVkxY6KL4FhpwLUbEbBeqN8o6o7poi1ewRF" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/qtVkxY6KL4FhpwLUbEbBeqN8o6o7poi1ewRF.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/qtVkxY6KL4FhpwLUbEbBeqN8o6o7poi1ewRF.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Então, como você pode ver, por padrão, o Apple Maps já está funcionando. Mais do que isso, se você vinculou tudo corretamente e habilitou a localização do usuário, ele realmente fez muitas coisas para nós (a permissão do usuário para a localização com uma mensagem padrão). Se você veio do desenvolvimento nativo do iOS, então, provavelmente, sabe o que é um arquivo info.plist.</p><h4 id="etapa-4-instalar-o-cocoapods-e-o-pacote-googlemaps-ios-"><strong>Etapa<strong> 4: </strong>i<strong>nstal</strong>ar o<strong> Cocoapods </strong>e o pacote<strong> </strong>"<strong>GoogleMaps</strong>"<strong> (iOS)</strong></strong></h4><p>O Apple Maps foi fácil, certo? Concordo — então, vamos ver o que o Google Maps tem para nós. Temos que instalar o Google Maps SDK para iOS. Usaremos o Cocoapods. Se você não o usou antes, execute <code>sudo gem install cocoapods</code>.</p><p>Agora, você tem que criar um Podfile, onde você especificará as dependências da sua aplicação para o &nbsp;iOS. Navegue até sua pasta iOS/ na sua aplicação do React Native e execute: <code>pod init</code> ou você pode usar &nbsp;<code>touch Podfile</code>. Você deve ter algo similar a isto:</p><pre><code># platform :ios, '9.0'</code></pre><pre><code>target 'ReactNativeMaps' do</code></pre><pre><code># Pods for ReactNativeMaps</code></pre><pre><code>pod 'GoogleMaps'</code></pre><pre><code>end</code></pre><p>Como você pode ver, adicionei o pod GoogleMaps e agora temos que instalá-lo. Se você ainda estiver na pasta iOS/, execute: <code>pod install</code> . Se você tentar executá-lo agora, provavelmente receberá um erro:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/soaOtijGp-7CiGQVsNiwgljfHyLEQvrDJvEg.png" class="kg-image" alt="soaOtijGp-7CiGQVsNiwgljfHyLEQvrDJvEg" width="600" height="400" loading="lazy"></figure><p>Ok, vamos fazer o que ele quer. Agora, devemos abrir o espaço de trabalho do xCode.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Vr6q4qYXaiFqnHdGtSNnhKSIZFqCMCFVeVEI.png" class="kg-image" alt="Vr6q4qYXaiFqnHdGtSNnhKSIZFqCMCFVeVEI" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Vr6q4qYXaiFqnHdGtSNnhKSIZFqCMCFVeVEI.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Vr6q4qYXaiFqnHdGtSNnhKSIZFqCMCFVeVEI.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Navegue até a pasta AirGoogleMaps em node_modules/</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Taoc1pnk-dNBMzyAmjjE3CO8AkOm8t9KQhXf.png" class="kg-image" alt="Taoc1pnk-dNBMzyAmjjE3CO8AkOm8t9KQhXf" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/Taoc1pnk-dNBMzyAmjjE3CO8AkOm8t9KQhXf.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/Taoc1pnk-dNBMzyAmjjE3CO8AkOm8t9KQhXf.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Arraste-a para o topo do seu projeto do xCode</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/ewvVl0gCwzwrNj1gd3itRZnWJVPGOCiKkdSo.png" class="kg-image" alt="ewvVl0gCwzwrNj1gd3itRZnWJVPGOCiKkdSo" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/ewvVl0gCwzwrNj1gd3itRZnWJVPGOCiKkdSo.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/ewvVl0gCwzwrNj1gd3itRZnWJVPGOCiKkdSo.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Tente construir seu projeto do xCode, se estiver falhando.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/6aQVp2Zl6gKnE6d3DdqMULm2WHmp70ws6QBE.png" class="kg-image" alt="6aQVp2Zl6gKnE6d3DdqMULm2WHmp70ws6QBE" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/6aQVp2Zl6gKnE6d3DdqMULm2WHmp70ws6QBE.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/6aQVp2Zl6gKnE6d3DdqMULm2WHmp70ws6QBE.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Você deve adicionar <code>HAVE_GOOGLE_MAPS=1</code> Preprocessor Macro para Build Settings</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/IhgPZQBomXmc4UKlP4ynYNIoU3Y0hlyGivGc.png" class="kg-image" alt="IhgPZQBomXmc4UKlP4ynYNIoU3Y0hlyGivGc" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/IhgPZQBomXmc4UKlP4ynYNIoU3Y0hlyGivGc.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/IhgPZQBomXmc4UKlP4ynYNIoU3Y0hlyGivGc.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><h4 id="etapa-5-obter-a-chave-da-api-do-google-maps-e-executar-a-aplica-o-do-ios-com-o-google-maps"><strong>Etapa<strong> 5: </strong>obter a chave da api do<strong> Google Maps</strong> e executar a aplicação do<strong> iOS </strong>com o<strong> Google Maps</strong></strong></h4><p>Agora, temos que gerar uma <a href="https://developers.google.com/maps/documentation/ios-sdk/get-api-key" rel="noopener"><strong><strong>Goo</strong>g<strong>le Maps API key</strong></strong></a><strong><strong>.</strong></strong></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/dnmuyvL7Nd99BHxkK2F4iUCBbBeoypyPVfyw.png" class="kg-image" alt="dnmuyvL7Nd99BHxkK2F4iUCBbBeoypyPVfyw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/dnmuyvL7Nd99BHxkK2F4iUCBbBeoypyPVfyw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/dnmuyvL7Nd99BHxkK2F4iUCBbBeoypyPVfyw.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Copie sua chave de API e adicione-a ao arquivo AppDelegate.m.</p><p><code>#import &lt;GoogleMaps/GoogleMaps.h&gt;</code></p><p><code>[GMSServices provideAPIKey:@"SUA_CHAVE_DE_API"]</code></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/oHeCkflMd3zznfYFMPBD6tglu4n9tfnoCghs.png" class="kg-image" alt="oHeCkflMd3zznfYFMPBD6tglu4n9tfnoCghs" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/oHeCkflMd3zznfYFMPBD6tglu4n9tfnoCghs.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/oHeCkflMd3zznfYFMPBD6tglu4n9tfnoCghs.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Informe ao seu componente MapView que está pronto para usar o Google Maps.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/EojYRgWTNtO0zlMmicx0EVmv-0dBi22Y3Euf.png" class="kg-image" alt="EojYRgWTNtO0zlMmicx0EVmv-0dBi22Y3Euf" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/EojYRgWTNtO0zlMmicx0EVmv-0dBi22Y3Euf.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/EojYRgWTNtO0zlMmicx0EVmv-0dBi22Y3Euf.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Ah, sim. Não se esqueça de executar sua aplicação do iOS. Agora, você já terá o Google Maps à disposição.</p><p>Eu espero.</p><h4 id="etapa-6-vamos-tentar-no-android-agora"><strong>Etapa<strong> 6: </strong>vamos tentar no<strong> Android </strong>agora</strong></h4><p>Ok. Agora, podemos sair do xCode e vamos apenas tentar <code>react-native run-android</code>. Se você estiver recebendo o mesmo que isto:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/06/PZJ0vNEXuf1F-IUTAx0UAoJcW9rZy9V1FlbR.png" class="kg-image" alt="PZJ0vNEXuf1F-IUTAx0UAoJcW9rZy9V1FlbR" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/06/PZJ0vNEXuf1F-IUTAx0UAoJcW9rZy9V1FlbR.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/06/PZJ0vNEXuf1F-IUTAx0UAoJcW9rZy9V1FlbR.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>verifique seu arquivo <strong>android/app/build.gradle</strong> e substitua <code>compile project(':react-native-maps')</code> por isto:</p><pre><code>implementation(project(':react-native-maps')){        exclude group: 'com.google.android.gms', module: 'play-services-base'        exclude group: 'com.google.android.gms', module: 'play-services-maps'    }implementation 'com.google.android.gms:play-services-base:12.0.0'implementation 'com.google.android.gms:play-services-maps:12.0.0'</code></pre><p>Não se esqueça de adicionar a API_KEY ao arquivo AndroidManifest.xml.</p><pre><code>&lt;application&gt;
   &lt;meta-data android:name="com.google.android.geo.API_KEY"      android:value="SUA_CHAVE_DA_API"/&gt;
&lt;/application&gt;</code></pre><p>Sim, agora sua aplicação está rodando em ambas as plataformas. Verifique o repositório do <a href="https://github.com/react-community/react-native-maps/blob/master/README.md" rel="noopener"><strong><strong>react-native-maps</strong></strong></a> para mais coisas divertidas que você pode fazer com seu componente MapView.</p><h4 id="conclus-o"><strong><strong>Conclus</strong>ão</strong></h4><p>Espero que meu primeiro artigo tenha sido útil para você.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como usar os buffers de protocolo do Google em Python ]]>
                </title>
                <description>
                    <![CDATA[ Quando as pessoas que falam idiomas diferentes estão juntas e conversam, elas tentam usar uma linguagem que todos do grupo possam entender. Para isso, todos precisam traduzir seus pensamentos, que normalmente estão na sua língua nativa, para todos do grupo. Essa "codificação e decodificação" do idioma, no entanto, leva a ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-usar-os-buffers-de-protocolo-do-google-em-python/</link>
                <guid isPermaLink="false">65a66ac70cfcc403cf789d0b</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sabrina ]]>
                </dc:creator>
                <pubDate>Sun, 26 May 2024 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/unnamed-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/googles-protocol-buffers-in-python/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Use Google's Protocol Buffers in Python</a>
      </p><p>Quando as pessoas que falam idiomas diferentes estão juntas e conversam, elas tentam usar uma linguagem que todos do grupo possam entender.</p><p>Para isso, todos precisam traduzir seus pensamentos, que normalmente estão na sua língua nativa, para todos do grupo. Essa "codificação e decodificação" do idioma, no entanto, leva a uma perda de eficiência, velocidade e precisão.<br><br>O mesmo conceito está presente nos sistemas do computador e em seus componentes. Por que deveríamos enviar dados em XML, JSON, ou em outra linguagem de humanos se não precisamos entender diretamente sobre o que eles estão falando? Basta que possamos traduzir para o formato da linguagem humana se precisarmos.<br><br>Os buffers de protocolo são uma forma de codificar dados antes do transporte, o que reduz de maneira eficiente os blocos de dados e, portanto, aumenta a velocidade de envio. Eles abstraem os dados em um formato neutro em termos de linguagem e plataforma.</p><h3 id="-ndice"><strong>Índice</strong></h3><ul><li><a href="https://www.freecodecamp.org/portuguese/news/como-usar-os-buffers-de-protocolo-do-google-em-python/#por-que-precisamos-dos-buffers-de-protocolo">Por que precisamos dos buffers de protocolo?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-usar-os-buffers-de-protocolo-do-google-em-python/#o-que-s-o-os-buffers-de-protocolo-e-como-eles-funcionam">O que são os buffers de protocolo e como eles funcionam?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-usar-os-buffers-de-protocolo-do-google-em-python/#buffers-de-protocolo-com-o-python">Buffers de protocolo com o Python</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-usar-os-buffers-de-protocolo-do-google-em-python/#considera-es-finais">Considerações finais</a></li></ul><h2 id="por-que-precisamos-dos-buffers-de-protocolo"><strong>Por que precisamos dos buffers de protocolo?</strong></h2><p>O objetivo inicial dos buffers de protocolos foi o de simplificar o trabalho com protocolos de solicitação/resposta. Antes do ProtoBuf, O Google usou um formato diferente para solicitação adicional de manipulação do <a href="https://pt.wikipedia.org/wiki/Marshalling">marshaling</a> para o envio de mensagens.</p><p>Além disso, as novas versões dos formatos anteriores exigiam que os desenvolvedores tivessem a certeza de que as novas versões fossem entendidas antes de substituir as antigas, tornando o trabalho com elas um problema. </p><p>Isso motivou a Google a projetar uma interface que resolvesse precisamente esses problemas.</p><p>Os buffers do protocolo permitem alterações no protocolo sem interferir na compatibilidade. Além disso, servidores podem transmitir os dados e executar operações de leitura nos dados sem modificar o conteúdo.</p><p>Como o formato se autodescreve, o ProtoBuf é usado como base para geração automática de código para serializadores e desserializadores.</p><p>Outro caso de uso interessante é como a Google o usa para <a href="https://searchapparchitecture.techtarget.com/definition/Remote-Procedure-Call-RPC">chamadas de procedimento remoto</a> (RPC – texto em inglês) de curta duração e para armazenar dados persistentemente na Bigtable. Devido ao seu caso de uso especifico, eles integraram interfaces de RPC aos buffers de protocolo. Isso permite a geração rápida e direta de códigos <em>stub</em> que podem ser usados como pontos de partidas para a implementação real (mais a respeito de ProtoBuf RPC <a href="https://medium.com/@EmperorRXF/evaluating-performance-of-rest-vs-grpc-1b8bdf0b22da">aqui</a> – texto em inglês).</p><p>Outros exemplos de onde o ProtoBuf pode ser usado são os dispositivos IoT conectados através de redes móveis, nas quais a quantidade de dados enviadas deve ser pequena ou para aplicações de países onde larguras de banda altas ainda são raras. O envio de cargas úteis, otimizada em formatos binários, pode levar a diferenças perceptíveis no custo e na velocidade de operação.</p><p>Usar a compactação <code>gzip</code> em sua comunicação por HTTPS pode melhorar ainda mais essas métricas.</p><h2 id="o-que-s-o-os-buffers-de-protocolo-e-como-eles-funcionam"><strong>O que são os buffers de protocolo e como eles funcionam?</strong></h2><p>De modo geral, os buffers de protocolo podem ser definidos como uma interface para serialização de dados estruturados. Isso define uma forma normalizada de comunicação, totalmente independente de linguagens e plataformas. </p><p>O Google anuncia o buffer de protocolo <a href="https://developers.google.com/protocol-buffers">como</a>:</p><blockquote><em>Buffers de protocolo são os mecanismo extensível, neutro em termos de linguagem e de plataforma do Google para serializar dados estruturados<em> – </em>pense no<em> XML, </em>mas menor<em>,</em> mais rápido e mais simples. Você define como deseja que seus dados sejam estruturados uma vez<em>…</em></em></blockquote><p>A interface ProtoBuf descreve a estrutura de dados a serem enviados. As estruturas de cargas útil são definidas como "mensagens" no que é chamado de Proto-Arquivo. Esses arquivos sempre terminam com a extensão <code>.proto</code><strong><strong> </strong></strong><br><br>Por exemplo, a estrutura básica de um arquivo <strong><strong>todolist.proto</strong></strong> é semelhante a que vemos a seguir. Também veremos um exemplo completo na próxima seção.</p><pre><code class="language-javascript">syntax = "proto3";

// Não é necessário para Python, ainda deve ser declarado para evitar colisões de nomes
// no namespace Protocol Buffers e em linguagens além do Python

package protoblog;

message TodoList {
   // Os elementos da lista de tarefas serão definidos aqui
      ...
}</code></pre><p>Esses arquivos são, então, usados para gerar classes de integração ou <em>stubs</em> para a linguagem de sua escolha usando geradores de código dentro do compilador protoc. A versão atual, Proto3, já suporta todas as principais linguagens de programação. A comunidade oferece suporte a muito mais implementações de código aberto de terceiros.</p><p>As classes geradas são os elementos principais dos buffers de protocolo. Eles permitem a criação de elementos instanciando novas mensagens, baseadas nos arquivos <code>.proto</code>, que são, então, utilizados para serialização. Veremos em detalhes como isso é feito com Python na próxima seção.</p><p>Independentemente da linguagem de serialização, as mensagens são serializadas em um formato binário, não auto descritivo, que é bastante inútil sem a definição inicial da estrutura.</p><p>Os dados binários podem, então, ser armazenados, enviados pela rede e usados de qualquer outra forma que os dados legíveis por humanos, como JSON ou XML, sejam. Após a transmissão ou armazenamento, o fluxo de bytes pode ser desserializado e restaurado usando <strong>qualquer</strong> classe protobuf compilada específica da linguagem que geramos a partir do arquivo .proto.<br><br>Usando Python como exemplo, o processo poderia ser mais ou menos assim:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/protobuf_arch.png" class="kg-image" alt="protobuf_arch" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/protobuf_arch.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/protobuf_arch.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/protobuf_arch.png 1600w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Primeiro, criamos uma lista de tarefas e a preenchemos com algumas tarefas. Essa lista de tarefas é, então, serializada e enviada pela rede, salva em um arquivo ou armazenada persistentemente em um banco de dados.</p><p>O fluxo de bytes enviado é desserializado usando o método <em>parse</em> de nossa classe compilada específica da linguagem.<br><br>A maioria das arquiteturas e infraestruturas atuais, especialmente microsserviços, é baseada em comunicação REST, WebSockets ou GraphQL. No entanto, quando a velocidade e a eficiência são essenciais, os RPCs de baixo nível podem fazer uma enorme diferença.</p><p>Em vez de protocolos de alta sobrecarga, podemos usar uma forma rápida e compacta de mover dados entre as diferentes entidades para o nosso serviço sem desperdiçar muitos recursos.</p><h3 id="por-que-isso-ainda-n-o-usado-em-todos-os-lugares"><strong>P<strong>or que </strong>isso <strong>ainda não é usado em todos os lugares?</strong></strong></h3><p>Os buffers de protocolo são um pouco mais complicados do que outros formatos legíveis por humanos. Isso os torna comparativamente mais difíceis de depurar e integrar em suas aplicações.</p><p>Os tempos de iteração na engenharia também tendem a aumentar, pois as atualizações nos dados exigem a atualização dos arquivos proto antes do uso.</p><p>Considerações cuidadosas devem ser feitas, uma vez que o ProtoBuf pode ser uma solução com excesso de engenharia em muitos casos.</p><h3 id="que-alternativas-eu-tenho"><strong>Que alternativas eu tenho?</strong></h3><p>Vários projetos adotam uma abordagem semelhante aos buffers de protocolo do Google.</p><p>Os <a href="https://google.github.io/flatbuffers/">Flatbuffer</a> do Google e uma implementação de terceiros, chamada Cap’n Proto, estão mais focados em remover a etapa de análise e descompactação, que é necessária para acessar os dados reais ao usar ProtoBufs. Eles foram projetados explicitamente para aplicações de desempenho crítico, tornando-os ainda mais rápidos e mais eficientes em termos de memória do que o ProtoBuf.<br><br>Ao focar nos recursos RPC do ProtoBuf (usado com gRPC), existem projetos de outras grandes empresas como Facebook (Apache Thrift) ou Microsoft (protocolos Bond) que podem oferecer alternativas.</p><h2 id="buffers-de-protocolo-com-o-python"><strong>Buffers de protocolo com o Python</strong></h2><p>O Python já fornece algumas formas de persistência de dados usando decapagem. A decapagem é útil em aplicações que tenham somente Python. Ela não é adequada para cenários mais complexos onde está envolvido o compartilhamento de dados com outras linguagens ou a alteração de esquemas.<br><br>Os buffers de protocolo, por outro lado, são desenvolvidos exatamente para esses cenários. O arquivo <code>.proto</code>, que abordamos rapidamente antes, permite ao usuário gerar código para muitas linguagens suportadas.</p><p>Para compilar o arquivo <code>.proto</code> para a classe de linguagem de nossa escolha, usamos <strong>protoc</strong>, o compilador proto.<br><br>Se você não possui o compilador protoc instalado, existem excelentes guias sobre como fazer isso:</p><ul><li><a href="http://google.github.io/proto-lens/installing-protoc.html">MacOS/Linux</a> (em inglês)</li><li><a href="https://github.com/protocolbuffers/protobuf/blob/master/src/README.md#c-installation---windows">Windows</a> (em inglês)</li></ul><p>Depois de instalar o protoc em nosso sistema, podemos usar um exemplo estendido de nossa estrutura de lista de tarefas anterior e gerar a classe de integração Python a partir dele.</p><pre><code class="language-javascript">syntax = "proto3";

// Não necessário para o Python, mas ainda deve ser declarado para evitar colisões de nome 
// no namespace dos Buffers de Protocolo e em linguagens que não sejam o Python
package protoblog;

// O guia de estilo prefere a prefixação de valores de enum em vez de cercá-los
// com uma mensagem de fechamento
enum TaskState {
    TASK_OPEN = 0;
    TASK_IN_PROGRESS = 1;
    TASK_POST_PONED = 2;
    TASK_CLOSED = 3;
    TASK_DONE = 4;
}

message TodoList {
    int32 owner_id = 1;
    string owner_name = 2;

    message ListItems {
        TaskState state = 1;
        string task = 2;
        string due_date = 3;
    }

    repeated ListItems todos = 3;
}
</code></pre><p>Vamos dar uma olhada mais detalhada na estrutura do arquivo &nbsp;<code>.proto</code> &nbsp;para entendê-lo. Na primeira linha do arquivo proto, definimos se estamos usando Proto2 ou 3. Nesse caso, estamos usando <a href="https://developers.google.com/protocol-buffers/docs/proto3">Proto3</a>.</p><p>Os elementos mais incomuns dos arquivos proto são os números atribuídos a cada entidade de uma mensagem. Esses números dedicados tornam cada atributo único e são usados para identificar os campos atribuídos na saída codificada em binário.</p><p>Um conceito importante de se entender é que apenas os valores de 1 a 15 são codificados com um byte a menos (Hex), o que é útil de entender para que possamos atribuir números mais altos às entidades usadas com menos frequência. Os números <strong>não definem a ordem</strong> de codificação <strong>nem a posição</strong> do atributo fornecido na mensagem codificada.</p><p>A definição do pacote ajuda a evitar conflitos de nomes. Em Python, os pacotes são definidos por seu diretório. Portanto, fornecer um atributo de pacote não tem nenhum efeito no código em Python gerado.</p><p>Observe que os pacotes ainda devem ser declarados para evitar colisões de nomes relacionadas ao buffer de protocolo e para outras linguagens como Java.</p><p>Enumerações são listagens simples de valores possíveis para uma determinada variável. Nesse caso, definimos um Enum para os possíveis estados de cada tarefa na lista de tarefas. Veremos como usá-los daqui a pouco, quando observarmos o uso em Python.<br><br>Como podemos ver no exemplo, também podemos aninhar mensagens dentro de mensagens. Se quisermos, por exemplo, ter uma lista de todos os dados associados a uma determinada lista de tarefas, podemos usar a palavra-chave <strong>repeated</strong>, que é comparável a <em>arrays</em> de tamanho dinâmico .</p><p>Para gerar código de integração utilizável, usamos o compilador proto, que compila um determinado arquivo .proto em classes de integração específicas da linguagem. No nosso caso, usamos o argumento <strong><strong>--python-out</strong></strong> para gerar código específico em Python.</p><p><code>protoc -I=. --python_out=. ./todolist.proto</code></p><p>No terminal, invocamos o compilador do protocolo com três parâmetros:</p><ol><li><strong><strong>-I</strong></strong>: define o diretório onde procuramos quaisquer dependências (usamos <code>.</code>, que é o diretório atual)</li><li><strong><strong>--python_out</strong></strong>: define o local onde queremos gerar uma classe de integração do Python (novamente usamos <code>.</code>, que é o diretório atual)</li><li>O último <strong>parâmetro sem nome</strong> define o arquivo .proto que será compilado (usamos o arquivo todolist.proto, no diretório atual)</li></ol><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/protoc.png" class="kg-image" alt="protoc" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/protoc.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/protoc.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/protoc.png 1162w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Isso cria um novo arquivo em Python chamado &lt;nome_do_arquivo_proto&gt;_pb2.py. No nosso caso, é todolist_pb2.py. Ao examinar esse arquivo mais de perto, não seremos capazes de entender muito sobre sua estrutura imediatamente.</p><p>Isso ocorre porque o gerador não produz elementos de acesso direto aos dados, mas abstrai ainda mais a complexidade usando metaclasses e descritores para cada atributo. Eles descrevem como uma classe se comporta em vez de cada instância dessa classe.<br><br>A parte mais interessante é como usar esse código gerado para criar, construir e serializar dados. Uma integração direta feita com nossa classe gerada recentemente é vista a seguir:</p><pre><code class="language-python">import todolist_pb2 as TodoList

my_list = TodoList.TodoList()
my_list.owner_id = 1234
my_list.owner_name = "Tim"

first_item = my_list.todos.add()
first_item.state = TodoList.TaskState.Value("TASK_DONE")
first_item.task = "Teste de ProtoBuf para o Python"
first_item.due_date = "31.10.2019"

print(my_list)</code></pre><p>Ele apenas cria uma lista de tarefas e adiciona um item a ela. Em seguida, imprimimos o próprio elemento da lista de tarefas e podemos ver a versão não binária e não serializada dos dados que acabamos de definir em nosso script.</p><pre><code class="language-json">owner_id: 1234
owner_name: "Tim"
todos {
  state: TASK_DONE
  task: "Teste de ProtoBuf para o Python"
  due_date: "31.10.2019"
}</code></pre><p>Cada classe <em>Protocol Buffer</em> possui métodos para ler e escrever mensagens usando uma &nbsp;<a href="https://developers.google.com/protocol-buffers/docs/encoding">codificação específica do buffer de protocolo</a> (texto em inglês), que codifica mensagens em formato binário. Esses dois métodos são <code>SerializeToString()</code> e <code>ParseFromString()</code>.</p><pre><code class="language-python">import todolist_pb2 as TodoList

my_list = TodoList.TodoList()
my_list.owner_id = 1234

# ...

with open("./serializedFile", "wb") as fd:
    fd.write(my_list.SerializeToString())


my_list = TodoList.TodoList()
with open("./serializedFile", "rb") as fd:
    my_list.ParseFromString(fd.read())

print(my_list)</code></pre><p>No exemplo de código acima, escrevemos a string serializada de bytes em um arquivo usando os sinalizadores <strong>wb</strong>.</p><p>Como já escrevemos o arquivo, podemos ler o conteúdo e analisá-lo usando ParseFromString. ParseFromString chama uma nova instância de nossa classe serializada usando os sinalizadores <strong>rb </strong>e a analisa.</p><p>Se serializarmos essa mensagem e se a imprimimos no console, obteremos a representação de bytes semelhante a esta.</p><p><code>b'\x08\xd2\t\x12\x03Tim\x1a(\x08\x04\x12\x18Teste de ProtoBuf para o Python\x1a\n31.10.2019'</code></p><p>Observe o b na frente das aspas. Isso indica que a string a seguir é composta de octetos de bytes em Python.</p><p>Se compararmos isso diretamente com, por exemplo, XML, podemos ver o impacto que a serialização do ProtoBuf tem no tamanho.</p><pre><code class="language-xml">&lt;todolist&gt;
	&lt;owner_id&gt;1234&lt;/owner_id&gt;
	&lt;owner_name&gt;Tim&lt;/owner_name&gt;
	&lt;todos&gt;
		&lt;todo&gt;
			&lt;state&gt;TASK_DONE&lt;/state&gt;
			&lt;task&gt;Teste de ProtoBuf para o Python&lt;/task&gt;
			&lt;due_date&gt;31.10.2019&lt;/due_date&gt;
		&lt;/todo&gt;
	&lt;/todos&gt;
&lt;/todolist&gt;</code></pre><p>A representação JSON, ajustada, ficaria assim.</p><pre><code class="language-json">{
	"todoList": {
		"ownerId": "1234",
		"ownerName": "Tim",
		"todos": [
			{
				"state": "TASK_DONE",
				"task": "Teste de ProtoBuf para o Python",
				"dueDate": "31.10.2019"
			}
		] 
	}
}</code></pre><p>Julgando os diferentes formatos apenas pelo número total de bytes utilizados, ignorando a memória necessária para o <em>overhead</em> de formatação, podemos obviamente ver a diferença.<br><br>Além da memória utilizada para os dados, no entanto, também temos <strong>12 bytes extras no ProtoBuf</strong> para formatação de dados serializados. Comparando isso com XML, temos <strong>171 bytes extras em XML</strong> para formatar dados serializados.</p><p>Sem um esquema, precisamos de <strong>136 bytes extras em JSON</strong> para formatar dados serializados.</p><p>Se estamos falando de milhares de mensagens enviadas pela rede ou armazenadas em disco, o ProtoBuf pode fazer a diferença.</p><p>Há uma questão importante, no entanto. A plataforma Auth0.com criou uma extensa comparação entre ProtoBuf e JSON. Ela mostra que, quando comprimido, a diferença de tamanho entre os dois pode ser mínima (apenas cerca de 9%).</p><p>Se você estiver interessado nos números exatos, consulte o <a href="https://auth0.com/blog/beating-json-performance-with-protobuf/">artigo completo</a> (em inglês), que fornece uma análise detalhada de vários fatores como tamanho e velocidade.</p><p>Uma observação interessante é que cada tipo de dados possui um valor padrão. Se os atributos não forem atribuídos ou alterados, eles manterão os valores padrão. No nosso caso, se não alterarmos o TaskState de um ListItem, ele terá o estado "TASK_OPEN" por padrão. A vantagem significativa disso é que os valores não definidos não são serializados, economizando espaço adicional.</p><p>Se, por exemplo, alterarmos o estado da nossa tarefa de TASK_DONE para TASK_OPEN, ela não será serializada.</p><pre><code class="language-json">owner_id: 1234
owner_name: "Tim"
todos {
  task: "Teste de ProtoBuf para o Python"
  due_date: "31.10.2019"
}</code></pre><p><code>b'\x08\xd2\t\x12\x03Tim\x1a&amp;\x12\x18Teste de ProtoBuf para o Python\x1a\n31.10.2019'</code></p><h2 id="considera-es-finais"><strong>Considerações finais</strong></h2><p>Como vimos, os buffers de protocolo são bastante úteis quando se trata de velocidade e eficiência ao trabalhar com dados. Devido à sua natureza poderosa, pode levar algum tempo para se acostumar com o sistema ProtoBuf, embora a sintaxe para definir novas mensagens seja simples.</p><p>Como última observação, quero salientar que houve/há discussões em andamento sobre a "utilidade" dos buffers de protocolo para aplicações regulares. Eles foram desenvolvidos explicitamente para problemas que o Google tinha em mente.<br><br>Se você tiver alguma dúvida ou <em>feedback</em>, sinta-se à vontade para entrar em contato com o autor em qualquer mídia social, como o <a href="https://twitter.com/timigrossmann">Twitter</a> ou por <a href="mailto:contact.timgrossmann@gmail.com">e-mail</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Desvendando a entrevista de front-end ]]>
                </title>
                <description>
                    <![CDATA[ As entrevistas técnicas na área de front-end são difíceis. Isso é um fato. Você não precisa apenas de um conhecimento sólido em fundamentos ciência da computação, mas também precisa de um entendimento relacionado ao desempenho da web, construção de sistemas e engines de layout com o CSS. Apesar de existirem ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/desvendando-a-entrevista-de-front-end/</link>
                <guid isPermaLink="false">6554c77af2994303ed343749</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento Front-End ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sabrina ]]>
                </dc:creator>
                <pubDate>Wed, 03 Apr 2024 00:06:27 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/01/1_fM15DmX9fOiTyFftaxRbPg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/cracking-the-front-end-interview-9a34cd46237/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Cracking the front-end interview</a>
      </p><p>As entrevistas técnicas na área de front-end são difíceis. Isso é um fato. Você não precisa apenas de um conhecimento sólido em fundamentos ciência da computação, mas também precisa de um entendimento relacionado ao desempenho da web, construção de sistemas e <em>engines</em> de layout com o CSS.</p><p>Apesar de existirem recursos por ai, eu encontrei apenas algumas guias para ajudar você a se preparar para uma entrevista na área de <em>front-end</em>. Então, eu decidi escrever um artigo em tópicos que espero poder ajudar você a se sair bem em sua próxima entrevista. </p><h4 id="antes-da-entrevista"><strong>Antes da entrevista</strong></h4><p>Antes de sua entrevista, pergunte ao seu recrutador qual o formato da entrevista. Em algumas entrevistas é usado o quadro branco, enquanto em outras é usado um editor de texto <em>on-line</em> como o CoderPad. É importante você saber para que possa praticar no ambiente que ocorrerá na entrevista.</p><p>Pergunte para seu recrutador quais tópicos você deve focar quando estiver se preparando. A razão por trás disso é porque além de perguntas especificas de <em>front-end</em>, algumas empresas farão perguntas tradicionais de ciência da computação, sobre tópicos como algoritmos de busca e classificação.</p><h3 id="conceitos-de-front-end"><strong>Conceitos de <em>f<strong>ront-end</strong></em></strong></h3><p>HTML, CSS, JavaScript e padrões de design em JavaScript são as chaves do que você deverá encontrar durante uma entrevista. Examine a lista e certifique-se de que está confortável com cada tópico.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/01/kSrkqRoD-JwPE5pcgrSLh5iafT5rmv9sIsAf.png" class="kg-image" alt="kSrkqRoD-JwPE5pcgrSLh5iafT5rmv9sIsAf" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/01/kSrkqRoD-JwPE5pcgrSLh5iafT5rmv9sIsAf.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/01/kSrkqRoD-JwPE5pcgrSLh5iafT5rmv9sIsAf.png 800w" sizes="(min-width: 720px) 720px" width="800" height="326" loading="lazy"><figcaption>HTML e CSS</figcaption></figure><p>HTML e CSS são o básico do desenvolvimento para <em>front-end</em>. Durante as entrevistas, você deve está preparado para as perguntas sobre nuances do HTML e CSS. Desde já, esteja preparado para programar um layout baseado em um <em>mockup</em>.</p><p>Se você precisar relembrar alguma coisa de HTML e CSS, aqui estão alguns conceitos básicos para praticar (em inglês):</p><ul><li><a href="https://css-tricks.com/almanac/properties/a/animation/" rel="noopener">Animações em CSS</a></li><li><a href="https://css-tricks.com/css-sprites/" rel="noopener">Sprites em CSS</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes" rel="noopener">Pseudoclasses</a></li><li><a href="http://www.sitepoint.com/understanding-css-grid-systems/" rel="noopener">Sistemas de <em>grid</em></a></li><li><a href="http://www.hongkiat.com/blog/html-5-semantics/" rel="noopener">Marcação semântica</a></li></ul><p>Além desses conceitos, estude sobre pré-processadores de CSS, como <a href="http://sass-lang.com/guide" rel="noopener">SASS</a> ou <a href="http://lesscss.org/" rel="noopener">LESS</a> e seus benefícios. Também procure entender as convenções de nomenclaturas do CSS como <a href="http://clubmate.fi/oocss-acss-bem-smacss-what-are-they-what-should-i-use/" rel="noopener">BEM e OOCSS</a>.</p><p>Outro ponto importante é que os entrevistadores buscam candidatos que defendam boas praticas de CSS. Como uma boa referência, esse guia escrito por um desenvolvedor de <em>front-end</em> do Medium proporciona informações sobre como o Medium chegou até sua arquitetura de CSS atual.</p><p>Eu mencionei inicialmente que alguns entrevistadores pedirão para você recriar layouts em HTML e CSS. Faça isso em um playground como o <a href="http://codepen.io/" rel="noopener">CodePen</a>. Pesquise no <a href="https://dribbble.com/" rel="noopener">Dribbble</a>, pois ele tem muitos designs simples que podem ser divertidos de recriar.</p><p>Finalmente, como desenvolvedores para <em>front-end</em>, estamos acostumados a fazer mudanças em nosso editor e depois verificar as mudanças em nosso navegador. Porém, na maioria das vezes durante as entrevistas, você não terá esse luxo. Quando você estiver se preparando para a entrevista, tente programar a maior parte de seu layout <em>sem</em> ficar olhando o resultado até o fim.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/01/sQoNHfiwR2EPih7QE2yoE3uaq-XLBPUVwaUI.png" class="kg-image" alt="sQoNHfiwR2EPih7QE2yoE3uaq-XLBPUVwaUI" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/01/sQoNHfiwR2EPih7QE2yoE3uaq-XLBPUVwaUI.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/01/sQoNHfiwR2EPih7QE2yoE3uaq-XLBPUVwaUI.png 800w" sizes="(min-width: 720px) 720px" width="800" height="326" loading="lazy"><figcaption>Conceitos de JavaScript</figcaption></figure><p>Se o HTML e o CSS são o básico do desenvolvimento para <em>front-end</em>, o JavaScript é o que faz as coisas acontecerem. As empresas durante a entrevista, gastarão um bom tempo testando seu conhecimento em JavaScript. Muitas questões girarão em torno dos seguintes conceitos (alguns dos textos em inglês):</p><ul><li><a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Inheritance_and_the_prototype_chain">Herança e cadeia de protótipos</a></li><li><a href="https://spin.atomicobject.com/2014/10/20/javascript-scope-closures/" rel="noopener">Escopo</a></li><li><a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Closures">Closures</a></li><li><a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Event_loop">Event loop</a></li><li><a href="http://javascript.info/tutorial/bubbling-and-capturing" rel="noopener">Bolhas de eventos</a></li><li><a href="http://javascriptissexy.com/javascript-apply-call-and-bind-methods-are-essential-for-javascript-professionals/" rel="noopener">Apply, call e bind</a></li><li><a href="https://www.quora.com/Whats-the-difference-between-a-promise-and-a-callback-in-Javascript" rel="noopener">Callbacks e promises</a></li><li><a href="http://adripofjavascript.com/blog/drips/variable-and-function-hoisting" rel="noopener">Hoisting de variáveis e funções</a></li><li><a href="http://www.sitepoint.com/currying-in-functional-javascript/" rel="noopener">Currying</a></li></ul><p>Quando receber uma pergunta de JavaScript, descubra em qual desses conceitos você esta sendo testado e será muito mais fácil descobrir a resposta certa. Se você se sente confiante em suas habilidades, teste seus conhecimentos <a href="https://www.toptal.com/javascript/interview-questions" rel="noopener">aqui</a>, <a href="https://www.codementor.io/javascript/tutorial/21-essential-javascript-tech-interview-practice-questions-answers" rel="noopener">aqui</a> e <a href="http://career.guru99.com/top-85-javascript-interview-questions/" rel="noopener">aqui</a>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/01/HgMt84IgJJ25UCc04UOAq-Eyf9bMJTcGOiyz.png" class="kg-image" alt="HgMt84IgJJ25UCc04UOAq-Eyf9bMJTcGOiyz" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/01/HgMt84IgJJ25UCc04UOAq-Eyf9bMJTcGOiyz.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/01/HgMt84IgJJ25UCc04UOAq-Eyf9bMJTcGOiyz.png 800w" sizes="(min-width: 720px) 720px" width="800" height="326" loading="lazy"><figcaption>Padrões de design</figcaption></figure><p>Os padrões de design em JavaScript fornecem soluções repetíveis de problemas comuns. Esses são alguns padrões de design que são importantes conhecer:</p><ul><li><a href="https://addyosmani.com/resources/essentialjsdesignpatterns/book/#decoratorpatternjavascript" rel="noopener">Decorator</a></li><li><a href="https://addyosmani.com/resources/essentialjsdesignpatterns/book/#factorypatternjavascript" rel="noopener">Factory</a></li><li><a href="https://addyosmani.com/resources/essentialjsdesignpatterns/book/#singletonpatternjavascript" rel="noopener">Singleton</a></li><li><a href="https://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript" rel="noopener">Módulo de revelação</a></li><li><a href="https://addyosmani.com/resources/essentialjsdesignpatterns/book/#facadepatternjavascript" rel="noopener">Facade</a></li><li><a href="https://addyosmani.com/resources/essentialjsdesignpatterns/book/#observerpatternjavascript" rel="noopener">Observer</a></li><li><a href="https://addyosmani.com/resources/essentialjsdesignpatterns/book/#detailmvc" rel="noopener">MVC</a>, <a href="https://addyosmani.com/resources/essentialjsdesignpatterns/book/#detailmvp" rel="noopener">MVP</a>, <a href="https://addyosmani.com/resources/essentialjsdesignpatterns/book/#detailmvvm" rel="noopener">MVVM</a></li></ul><p>Além dos padrões de design do JavaScript, é bom esta familiarizado com os <em>frameworks </em>do JavaScript. Isso <em>não </em>significa que você tem que aprender outro <em>framework </em>antes da sua entrevista. Em vez disso, aprenda <em>quando</em> e <em>por que </em>as equipes de <em>front-end</em> usam <em>frameworks</em>. Além disso, se você está participando de uma entrevista que envolve algo como React + Flux ou Angular, revise um pouco da documentação de arquitetura do <em>framework </em>antes.</p><h3 id="conceitos-da-ci-ncia-da-computa-o"><strong>Co</strong>nceitos da ciência da computação</h3><p>Algumas empresas contratam engenheiros de software antes de desenvolvedores para <em>front-end</em>. Isso significa que as empresas esperam que você tenha um bom conhecimento em alguns tópicos, como princípios de design de software, arquitetura de código escalável e testes.</p><p>Se seu recrutador sugerir que você revise seus conhecimentos em estruturas de dados e algoritmos, esta sessão é pra você. <em>Caso contrário</em>, <em>sinta-se a vontade para pular a seção</em>. Se você não tem formação em ciência da computação, sem problemas. A maior parte desses conceitos são fáceis de aprender.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/01/76cnKEq5zyOttGxS4niXFV3uomvDUu4VHBbB.png" class="kg-image" alt="76cnKEq5zyOttGxS4niXFV3uomvDUu4VHBbB" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/01/76cnKEq5zyOttGxS4niXFV3uomvDUu4VHBbB.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/01/76cnKEq5zyOttGxS4niXFV3uomvDUu4VHBbB.png 800w" sizes="(min-width: 720px) 720px" width="800" height="326" loading="lazy"><figcaption>Estruturas de dados</figcaption></figure><p>Essas são as estruturas básicas que eu gostaria de sugerir. Não se prenda apenas na leitura, reserve um tempo para implementá-las em JavaScript. Se você não está familiarizado com testes unitários, teste sua estrutura de dados com uma biblioteca como o <a href="https://mochajs.org/" rel="noopener">Mocha</a> para aprender.</p><ul><li>Listas vinculadas</li><li>Tabelas hash</li><li>Pilhas e filas</li><li>Árvores (árvores binárias e <em>heaps</em>)</li><li>Grafos</li></ul><p>Nota: para grafos, procure saber como implementar travessias de busca em profundidade e em largura.</p><p>Para as implementações dessas estruturas de dados, você pode consultar a <a href="http://www.sanfoundry.com/java-programming-examples-data-structures/" rel="noopener">SanFoundry</a>. Todos os exemplos estão em Java, mas reimplementá-los em JavaScript é fácil.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/01/5kzjHR2GSeHicNrakjPogvJbR63hTxfALqim.png" class="kg-image" alt="5kzjHR2GSeHicNrakjPogvJbR63hTxfALqim" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/01/5kzjHR2GSeHicNrakjPogvJbR63hTxfALqim.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/01/5kzjHR2GSeHicNrakjPogvJbR63hTxfALqim.png 800w" sizes="(min-width: 720px) 720px" width="800" height="326" loading="lazy"><figcaption>Ordenação</figcaption></figure><p>Uma vez que você estiver confiante sobre estruturas de dados, você pode passar para a ordenação. Implemente os algoritmos em JavaScript, faça anotações sobre suas complexidades de tempo e espaço.</p><ul><li>Busca binária</li><li>Ordenação de bolha (Bubble sort)</li><li>Ordenação de inserção (Insertion sort)</li><li>Ordenação de mescla (Merge sort)</li><li>Ordenação rápida (Quick sort)</li><li>Ordenação de seleção (Selection sort)</li></ul><p>Depois de revisar estruturas de dados e algoritmos, teste seus conhecimentos com o <a href="https://leetcode.com/" rel="noopener">Leetcode</a> e <a href="https://www.interviewcake.com/javascript-interview-questions" rel="noopener">com perguntas técnicas sobre JavaScript</a> (links em inglês).</p><h3 id="para-encerrar">Para encerrar</h3><p>Eu sei que é muita coisa para absorver, especialmente se você é novo na área de desenvolvimento para <em>front-end</em>. Comece se preparando para suas entrevistas com antecedência, então você se sentirá mais confortável quando chegar a hora.</p><p>Além do mais, lembre-se de que, independentemente do resultado, as entrevistas não medem o seu valor como programador. Algumas pessoas são boas nas entrevistas; outras, não. Às vezes você conquista o entrevistador; às vezes, não.</p><p>Se você tiver alguma dúvida, deixe uma nota no <a href="https://twitter.com/JonathanZWhite" rel="noopener">Twitter</a> para o autor. Ele <strong>gostaria</strong> saber como foi sua entrevista. Boa sorte!</p><p>Se quiser saber mais, siga o autor no <a href="https://twitter.com/JonathanZWhite" rel="noopener">Twitter</a>. Lá, ele publica informações sobre design, desenvolvimento para <em>front-end</em>, <em>bots </em>e aprendizagem de máquina.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
