O que um nu faz?

10

bash não parece reclamar se você executar um comando como

$ < some-file-that-exists

Nada parece acontecer.

Você também pode usar

$ <<<"any string"

e até mesmo substituição de processo.

Então, o que exatamente isso faz e por que é permitido? Poderia ser útil para alguma coisa?

Comprimidos de explosão
fonte
BTW: Para o ótimo ZSH, "<foobar" é igual a "menos foobar", como seu foobar de redirecionamento para o shell. Eu acho que esse é um comportamento bastante intuitivo. Um bare <fornecerá um erro ( zsh: parse error near `\n'), pois nenhum argumento é fornecido.
math
@ você receberá um erro semelhante bash, mas isso é interessante less.
Explosion Pills

Respostas:

20

<configura o redirecionamento para um comando que pode ocorrer antes ou depois das instruções de redirecionamento. Ou seja,

$ < file wc

funciona bem como

$ wc < file

Mas se você não der um comando, o bash configurará o redirecionamento e não fará mais nada. Para o redirecionamento de entrada, isso equivale ao que você viu, nada, se o arquivo existir e for legível. Se o arquivo não existir ou não for legível, o bash sinalizará um erro. Para o redirecionamento de saída, o arquivo de saída será criado se ele não existir. Qualquer arquivo de saída existente será truncado se >for usado; nenhum truncamento se >>for usado.

Kyle Jones
fonte
em outras palavras, eles são existe um conciso e criar
catraca aberração
@Kyle Jones Acho que você não combinou os dois operadores na última frase.
jamesbtate
@Puddingfox Thanks. Eu editei a sentença final no final para esclarecer.
Kyle Jones
Existe algum motivo para usar < file wcvs. wc < file?
Pílulas de explosão
1
@tandu É útil quando se usa conchas interativas. Digamos que você tenha um comando que use o redirecionamento e deseje repeti-lo com um último argumento diferente. Se o redirecionamento estiver no início da linha, é fácil digitar control-P e editar o último argumento sem precisar pular o idioma "<foo> bar 2> & 1" como faria no final. Além disso, não encontrei utilidade para isso.
Kyle Jones
5

<lê de stdin por padrão ou um arquivo. sua expressão não faz nada com a entrada porque você não fez nada após a leitura.

se você criar um arquivo de saída <algum arquivo que exista> no final, verá que acabou de ler o conteúdo do primeiro arquivo e gravá-lo no segundo arquivo.

<<< está aqui no formato doc, então ele lê de uma sequência em vez de um arquivo. gato <<< "qualquer string" para ver o que você leu.

johnshen64
fonte
2
para referência futura, por favor edite sua resposta para adicionar detalhes em vez de adicionar um comentário
Nate Koppenhaver
2
"se você fizer o arquivo de saída <algum arquivo que existe> no final, verá que acabou de ler o conteúdo do primeiro arquivo e gravá-lo no segundo arquivo." Isto está errado; sem um comando, o arquivo de saída será truncado para zero bytes.
Kyle Jones