O comando `yes` pode parecer excessivamente básico para aplicações práticas, mas neste guia, vamos explorar seu uso e como tirar proveito de sua natureza repetitiva no Linux e macOS.
Entendendo o Comando `yes`
O `yes` é um dos comandos mais elementares em sistemas Linux e outros sistemas baseados em Unix, como o macOS. Sua simplicidade se reflete tanto na utilização quanto na sua implementação inicial. O código fonte da versão original, criada por Ken Thompson para o System 7 Unix, consiste em apenas seis linhas de código.
Não se deixe enganar pela sua simplicidade, pois este pequeno comando pode ser utilizado de maneiras interessantes e proveitosas.
Como o `yes` Funciona?
Quando executado sem parâmetros, o comando `yes` age como se você estivesse digitando a letra “y” e pressionando Enter repetidamente, de forma contínua e rápida. Esse processo só é interrompido ao pressionar Ctrl+C.
yes
Na realidade, o `yes` pode gerar qualquer mensagem que você escolher. Basta digitar `yes`, um espaço, a mensagem desejada e pressionar Enter. Normalmente, isso é usado para criar fluxos de saída com as strings “sim” ou “não”.
yes sim
yes qualquer mensagem que você quiser
Qual a Utilidade Disso?
A saída do `yes` pode ser redirecionada para outros programas ou scripts.
Já passou por aquela situação em que você inicia um processo longo e se afasta, deixando-o executar? Ao retornar, o processo não terminou e descobriu que ele estava aguardando uma resposta “sim” ou “não”.
Se você sabe antecipadamente que todas as suas respostas serão positivas (“sim” ou “s”) ou negativas (“não” ou “n”), pode usar o `yes` para fornecer essas respostas automaticamente. Assim, seu processo será executado até o fim, sem necessidade de intervenção, com o `yes` respondendo a todas as perguntas feitas.
Utilizando `yes` em Scripts
Considere o seguinte script shell Bash (imagine que este é um trecho de um script muito maior, que demanda um tempo considerável para ser executado):
#!/bin/bash # ... # no meio de um script longo # obtém uma resposta do usuário # ... echo "Você deseja prosseguir? [s,n]" read input # verificamos se recebemos uma resposta if [ "$input" == "" ]; then echo "Nenhuma entrada foi fornecida" # foi um s ou um sim? elif [[ "$input" == "s" ]] || [[ "$input" == "sim" ]]; then echo "Resposta positiva: $input" # tratamos qualquer outra coisa como resposta negativa else echo "Resposta negativa: $input" fi
Este script faz uma pergunta e aguarda uma resposta. O fluxo lógico do script é determinado pela entrada do usuário.
Um “sim” ou “s” indica uma resposta positiva.
Qualquer outra entrada é interpretada como uma resposta negativa.
Pressionar Enter sem nenhuma entrada não produz nenhuma ação.
Para testar, copie o script para um arquivo, salve-o como `script_longo.sh` e use o `chmod` para torná-lo executável.
chmod +x script_longo.sh
Execute o script com o seguinte comando. Tente fornecer “sim”, “s” e qualquer outra coisa como entrada, inclusive pressionando Enter sem texto.
./script_longo.sh
Para que o `yes` forneça a resposta ao script, redirecione sua saída para o script.
yes | ./script_longo.sh
Alguns scripts são mais rígidos em seus requisitos e aceitam apenas a palavra “sim” completa como resposta positiva. Você pode fornecer “sim” como parâmetro para o `yes`, da seguinte forma:
yes sim | ./script_longo.sh
Cuidado ao Usar `yes`
É crucial ter certeza de que a entrada que você está direcionando para o script ou programa produzirá o resultado esperado. Para isso, é essencial conhecer as perguntas que serão feitas e as respostas adequadas.
A lógica do script, comando ou programa pode não corresponder às suas expectativas. Por exemplo, em nosso script de exemplo, a pergunta poderia ser “Deseja parar? [s,n]”. Nesse caso, uma resposta negativa permitiria que o script continuasse.
É imprescindível estar familiarizado com o script, comando ou programa antes de usar o `yes` para alimentá-lo com respostas.
`yes` e Comandos
Antigamente, o `yes` era frequentemente usado com outros comandos do Linux. No entanto, a maioria dos comandos agora possui opções para funcionar sem interação humana, tornando o uso do `yes` menos necessário.
Tomemos como exemplo o gerenciador de pacotes do Ubuntu, `apt-get`. Anteriormente, para instalar um aplicativo sem ter que confirmar com “y”, usava-se o `yes` da seguinte forma:
yes | sudo apt-get install fortune-mod
O mesmo resultado pode ser obtido usando a opção `-y` (assumir sim) do `apt-get`:
sudo apt-get -y install fortune-mod
Você verá que o `apt-get` nem sequer fez a pergunta padrão “Deseja continuar? [S/n]”. Ele simplesmente assumiu que a resposta seria “sim”.
Em outras distribuições Linux, a situação é semelhante. No Fedora, você teria usado o comando abaixo:
yes | yum install fortune-mod
O gerenciador de pacotes `dnf` substituiu o `yum`, e o `dnf` também tem sua própria opção `-y` (assumir sim).
dnf -y install fortune-mod
O mesmo se aplica aos comandos `cp`, `fsck` e `rm`, que possuem opções como `-f` (forçar) ou `-y` (assumir sim).
Então, parece que o `yes` agora só é útil com scripts? Não exatamente. Ainda existem algumas aplicações adicionais para este comando.
Outras Aplicações do `yes`
Você pode usar o `yes` com uma sequência de números gerados pelo `seq` para controlar um loop de ações repetidas.
O comando abaixo imprime os números gerados na tela e, em seguida, aguarda um segundo antes de repetir.
Em vez de simplesmente exibir os números, você pode executar outro comando ou script. Este comando ou script não precisa necessariamente usar os números; eles servem apenas para iniciar cada ciclo do loop.
yes "$(seq 1 20)" | while read digit; do echo digit; sleep 1; done
Às vezes, é útil ter um arquivo grande para testes, como praticar o uso do comando `zip` ou testar uploads FTP.
Você pode criar arquivos grandes rapidamente com o `yes`. Basta fornecer uma sequência longa de texto e redirecionar a saída para um arquivo. Tenha cuidado, pois esses arquivos podem crescer rapidamente. Esteja pronto para pressionar Ctrl+C em alguns segundos.
yes uma longa linha de texto sem significado para preencher o arquivo > arquivo_teste.txt
ls -lh arquivo_teste.txt
wc arquivo_teste.txt
O arquivo criado aqui levou cerca de cinco segundos na máquina de teste utilizada para este artigo. O comando `ls` informa que ele tem 557 Mb, e o comando `wc` indica que tem 12,4 milhões de linhas.
Podemos limitar o tamanho do arquivo incluindo o `head` em nosso comando. O número após o `-` indica quantas linhas incluir no arquivo. O `-50` significa que apenas 50 linhas serão direcionadas para o `arquivo_teste.txt`.
yes uma longa linha de texto sem significado para preencher o arquivo | head -50 > arquivo_teste.txt
Assim que o arquivo `arquivo_teste.txt` tiver 50 linhas, o processo será interrompido, sem a necessidade de usar Ctrl+C. Ele para de maneira limpa por si só.
O `wc` informa que há exatamente 50 linhas no arquivo, 400 palavras e 2350 bytes.
Embora ainda seja útil para fornecer respostas a scripts de longa execução (e alguns outros truques), o comando `yes` provavelmente não fará parte do seu conjunto de ferramentas diário. No entanto, quando precisar, você descobrirá que sua simplicidade é uma grande vantagem – e tudo isso em apenas seis linhas de código.