>> file command
Does it mean that allstdout
is redirected, not only that from command?
Esse redirecionamento afeta um comando simples. De man 1 bash
:
Before a command is executed, its input and output may be redirected using a special notation interpreted by the shell. […] The following redirection operators may precede or appear anywhere within a simple command or may follow a command. Redirections are processed in the order they appear, from left to right.
"Os seguintes operadores de redirecionamento" são [n]<word
, [n]>word
, [n]>>word
etc.
A simple command is a sequence of optional variable assignments followed by blank-separated words and redirections, and terminated by a control operator.
e
control operator
A token that performs a control function. It is one of the following symbols:||
&
&&
;
;;
(
)
|
|&
<newline>
Isso significa que os seguintes comandos são equivalentes:
echo Some text >> file
echo Some >> file text
echo >> file Some text
>> file echo Some text
A questão está marcada com bash e cito man 1 bash
, mas o os comandos acima funcionam em sh
também.
O analisador de linha de comando precisa "servir" todos os redirecionamentos antes de executar o comando (ou seja, o comando retirado desses redirecionamentos). Pense nisso, o procedimento é o mesmo, independentemente de onde o redirecionamento específico é. Não há razão para exigir que seja no final.
When and why would you reverse the order?
Não me lembro de uma situação em que eu quisesse ter um redirecionamento no meio. Há, no entanto, um caso de uso em que ter um redirecionamento de entrada no início é bastante útil. Considere este código:
grep foo file | tail | …
Imagine que o cano seja muito longo. É postado no Super User e resolve algum problema. Você pode colá-lo em seu console e executá-lo. E se você preferir acrescentar a algum comando ou pipe? Por exemplo. você quer pegar:
my_custom_command | grep foo | tail | …
# ^^^^^^^^^^^^^^^^^^^ this is the part you'd be happy to paste
Você precisa remover file
do comando copiado. Por esse motivo, alguns usuários preferem postar comandos como este:
cat file | grep foo | tail | …
# ^^^^^^^^^^^^^^^^^^^ it's easy to copy this
# ^^^^^^^^^^^^^^^^^^^^^ or even this
Em outras circunstâncias, isso seria um uso totalmente inútil de cat
. Alguns diriam que ainda é, independentemente das circunstâncias. Que tal:
< file grep foo | tail | …
# ^^^^^^^^^^^^^^^^^^^ it's easy to copy this
Sem cat
e uma forma conveniente!