O que faz o “comando de arquivo” e como ele difere do “arquivo de comando”?

6

A partir deste altamente votado comentário para O que significa '> >' significa no comando do terminal? :

"program before" What does that mean? Command obviously, but redirections can also be written prepended, i.e. >> file command

Não me lembro de ter visto tal caso - embora, dada a quantidade de votos positivos, eles existam claramente. Eu só vi e usei comandos de redirecionamento do formato

command >> file

ao usar >> e sua laia (ou seja, 2> , 2>&1 , etc.).

Quando e por que você reverteria o pedido? Isso significa que todos os stdout são redirecionados, não apenas de command ? Alguém tem algum exemplo concreto?

Eu tive um google e pude encontrar exemplos imediatos.

    
por Greenonline 29.06.2018 / 19:29

2 respostas

6

>> file command
Does it mean that all stdout 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!

    
por 29.06.2018 / 20:59
3

Explicação

A chave para entender como os operadores de redirecionamento de E / S trabalham é lembrar que você está trabalhando em um shell que está constantemente imprimindo para STDOUT ou STDERR (principalmente) com todos os comandos digitados.

>> não se importa como a saída acontece, mas somente quando isso acontece pode anexá-la ao arquivo que a segue diretamente. Também é importante ter em mente que os operadores de redirecionamento não se envolverão em seus comandos. Você pode testar mais coisas digitando echo hello >> newfile this is my output e quando você cat newfile você verá: "Olá, esta é minha saída".

Neste caso particular, a ordem dos comandos em combinação com o operador append (> >) não é necessariamente o mais importante a ser observado. Em vez disso, assista ao resultado dos seus comandos, como o comentário de Kamil acima evitou. Contanto que algo que não seja um erro seja impresso no seu shell, >> pode fazer o seu trabalho.

O trabalho do comando echo é imprimir na saída padrão (STDOUT). Experimente por conta própria e você verá uma nova linha com sua saída. Se você incluir >> file no mix, terá o que aparecer nessa nova linha anexada a esse arquivo. A ordem disso é importante, no entanto. O arquivo para anexar deve suceder diretamente ao operador.

Nota sobre os exemplos

Com relação a exemplos concretos, eu diria que você não encontrará muitos deles, já que mudar a ordem é visto como menos intuitivo / legível do que algumas setas que apontam de uma fonte para outra. Além disso, quando você está escrevendo scripts de shell detalhados, há uma necessidade ainda maior de código intuitivo e legível.

Se você deseja ter um entendimento ainda mais profundo disso, comece a aprender sobre descritores de arquivos (STDIN, STDOUT, STDERR) e como o sistema de chamadas do Unix funciona. Isso tudo pode ser visto como uma janela para a Programação do Sistema Unix e como o Unix / Linux funciona em um nível mais profundo.

    
por 29.06.2018 / 20:30