You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
5.9 KiB
130 lines
5.9 KiB
11 months ago
|
<!DOCTYPE html>
|
||
|
<html lang="en">
|
||
|
<head>
|
||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||
|
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||
|
|
||
|
<!-- Enable responsiveness on mobile devices-->
|
||
|
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape-->
|
||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover">
|
||
|
|
||
|
<title>Julio Biason .Me 4.3</title>
|
||
|
|
||
|
<!-- CSS -->
|
||
|
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print">
|
||
|
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css">
|
||
|
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css">
|
||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface">
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
</head>
|
||
|
|
||
|
<body class=" ">
|
||
|
|
||
|
<div class="sidebar">
|
||
|
<div class="container sidebar-sticky">
|
||
|
<div class="sidebar-about">
|
||
|
|
||
|
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a>
|
||
|
|
||
|
<p class="lead">Old school dev living in a 2.0 dev world</p>
|
||
|
|
||
|
|
||
|
</div>
|
||
|
|
||
|
<ul class="sidebar-nav">
|
||
|
|
||
|
|
||
|
<li class="sidebar-nav-item"><a href="/">English</a></li>
|
||
|
|
||
|
<li class="sidebar-nav-item"><a href="/pt">Português</a></li>
|
||
|
|
||
|
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li>
|
||
|
|
||
|
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li>
|
||
|
|
||
|
|
||
|
</ul>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
|
||
|
<div class="content container">
|
||
|
|
||
|
<div class="post">
|
||
|
<h1 class="post-title">Um Shell Por Dia: Redirecionamento</h1>
|
||
|
<span class="post-date">
|
||
|
2021-09-14
|
||
|
|
||
|
<a href="https://blog.juliobiason.me/pt/tags/book/">#book</a>
|
||
|
|
||
|
<a href="https://blog.juliobiason.me/pt/tags/por-dia/">#por dia</a>
|
||
|
|
||
|
<a href="https://blog.juliobiason.me/pt/tags/shell/">#shell</a>
|
||
|
|
||
|
<a href="https://blog.juliobiason.me/pt/tags/redirecionamento/">#redirecionamento</a>
|
||
|
|
||
|
<a href="https://blog.juliobiason.me/pt/tags/stdin/">#stdin</a>
|
||
|
|
||
|
<a href="https://blog.juliobiason.me/pt/tags/stdout/">#stdout</a>
|
||
|
|
||
|
<a href="https://blog.juliobiason.me/pt/tags/stderr/">#stderr</a>
|
||
|
|
||
|
</span>
|
||
|
<p>Agora que conhecemos os descritores de entrada, saída e erro, vamos ver como
|
||
|
redirecionar a saída dos descritores para arquivos.</p>
|
||
|
<p>Vamos pegar um exemplo simples: <code>python manage.py migrate</code>, um comando que faz
|
||
|
parte do Django que altera o banco de dados. Se quisermos mandar a saída do
|
||
|
comando para um arquivo, podemos usar <code>></code>:</p>
|
||
|
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>python manage.py migrate > saida_migrate.txt
|
||
|
</span></code></pre>
|
||
|
<p>Quando seguido por <code>></code>, o shell faz com que o stdout de uma aplicação seja
|
||
|
enviada para um arquivo e, assim, qualquer saída da aplicação (com exceção do
|
||
|
que for escrito no stderr) será mandando para o arquivo.</p>
|
||
|
<p>Ainda, o arquivo é zerado toda vez que houver o redicionamento, e assim,
|
||
|
executar o comando acima duas vezes seguida fará com que o arquivo
|
||
|
"saida_migrate.txt" fique apenas com o resultado da segunda execução. Para
|
||
|
adicionar o conteúdo no final do arquivo ao invés de sobreescrever o conteúdo
|
||
|
inteiro, deve-se usar <code>>></code> ao invés de <code>></code>.</p>
|
||
|
<p>Mas, mais uma vez, até agora vimos como mandar stdout para um arquivo. Em
|
||
|
alguns casos, erros são enviados para stderr ao invés de stdout. Para
|
||
|
redirecionar stderr, usa-se <code>2></code>.</p>
|
||
|
<p>E, finalmente, aplicações que esperam entrada de dados -- digamos que o nosso
|
||
|
comando acima esperasse uma configuração, algo como "Type 'y' to continue" --
|
||
|
poderíamos criar um arquivo com <code>y</code> dentro e mandar isso para o migrate com
|
||
|
<code><</code>:</p>
|
||
|
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>python manage.py migrate < confirmacao
|
||
|
</span></code></pre>
|
||
|
<p>Até aqui, simples e direto. Existe ainda uma questão: Imagine que você queira
|
||
|
que toda a saída de uma aplicação, stdout e stderr, seja enviada para um
|
||
|
arquivo. A princípio, você tentaria</p>
|
||
|
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>python manage.py migrate > arquivo 2> arquivo
|
||
|
</span></code></pre>
|
||
|
<p>O problema desta chamada é que a saída do stdout iria criar o arquivo, e a
|
||
|
saída do stderr iria sobreescrever esta saída e mandar o stderr apenas (existe
|
||
|
uma complicação entre "descritores" e "arquivo em disco", onde o descritor pode
|
||
|
estar escrevendo num arquivo em disco que não existe mais, e para a aplicação
|
||
|
tudo continua andando normalmente, embora não pareça porque o arquivo não
|
||
|
exista, mas vamos ignorar essa parte aqui) o que podemos fazer é enviar o
|
||
|
stderr para stdout e redirecionar o stdout para o arquivo. Para redirecionar
|
||
|
stderr para stdout usamos <code>2>&1</code> -- <code>2></code> é realmente a saída do stdout, e <code>&1</code>
|
||
|
indica que queremos que a saída indicada seja enviada para o descritor "1" --
|
||
|
que é o stdout.</p>
|
||
|
<p>E ainda dá pra usar todo mundo junto:</p>
|
||
|
<pre style="background-color:#2b303b;color:#c0c5ce;"><code><span>python manage.py migrate 2>&1 > saida_migrate.txt < confirmaca
|
||
|
</span></code></pre>
|
||
|
|
||
|
</div>
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
</div>
|
||
|
|
||
|
</body>
|
||
|
|
||
|
</html>
|