Os >
e >>
são operadores de redirecionamento para FDs (descritores de arquivo)
No bash você tem FDs padrão de árvore que são a entrada padrão (strin), a saída padrão (strout) e o erro padrão (strerr). Estes também podem ser chamados por FD 0, FD 1 e FD 2, respectivamente.
Normalmente você teria todos os FDs apontando para o terminal, mas isso pode ser alterado usando o redirecionamento.
Por exemplo, se você ligar:
command > log.txt
Você redirecionará a saída para o arquivo log.txt
Isto é semelhante a chamar:
command 1> log.txt
Como isso redireciona apenas o strout, você ainda poderá ver o erro no terminal.
Para redirecionar o strerr para o seu arquivo log.txt, você terá que executar:
command 2> log.txt
Novamente, isso redireciona apenas o strerr. Se você deseja redirecionar stdout e stderr, é necessário duplicar a saída do stderr para stdout usando o comando >&
.
command 1> log.txt 2>&1
Para entender este comando, você precisa lê-lo da direita para a esquerda, primeiro uma cópia do stderr é feita para stdout e, em seguida, o strout é redirecionado para o arquivo log.txt.
Quando você usa o redirecionamento desta maneira, o bash não irá procurar se o arquivo existe ou não e simplesmente criar um, independentemente de isso implicar o apagamento do existente. Se você quiser evitar perder o que já foi escrito em seu arquivo de log, você pode usar o comando >>
da mesma maneira explicada acima, mas nesse caso todas as saídas serão anexadas aos arquivos existentes.
Para seu uso em C ++ com cin, cout e cerr, acho que o hash deu uma resposta melhor do que eu poderia.
Eu não sou especialista nisso, então talvez eu tenha entendido algumas coisas erradas. Para uma informação mais completa, aconselho a leitura do Guia Bash sobre o Wiki de Greg