O que a (divisa esquerda / triângulo) faz? [duplicado]

13

Estou com dificuldades para entender isso.

Eu entendo que > (chevron direita) é para redirecionar o STDOUT de um programa para um arquivo, como em echo 'polo' > marco.txt criará um arquivo de texto chamado marco.txt com polo como o conteúdo em vez de escrever para a saída do terminal. Eu também entendo a diferença entre isso e um | (pipe), que é usado para redirecionar o STDOUT do primeiro comando à esquerda do pipe para o STDIN do segundo comando à direita do pipe, como em echo 'Hello world' | less para mostrar Hello world na exibição less .

Eu realmente não entendo como o < funciona. Eu tentei marco.txt < echo 'polo' e o bash me deu um erro: -bash: echo: No such file or directory . Alguém pode explicar como funciona e por que eu o usaria?

    
por jsejcksn 16.05.2016 / 09:28

2 respostas

13

O operador < é mais comumente usado para redirecionar o conteúdo do arquivo. Por exemplo

grep "something" < /path/to/input.file > /path/to/output.file 

Isto irá grep o conteúdo de input.file, gerando linhas contendo "alguma coisa" para output.file

Não é um operador completo 'inverso' do > operador, mas é em um sentido limitado com relação aos arquivos.

Para uma descrição realmente boa e breve, juntamente com outras aplicações de < Vejo redirecionamento do io

Atualização: para responder sua pergunta nos comentários, veja como você pode trabalhar com descritores de arquivo com o bash usando o < operador:

Você pode adicionar entradas e / ou saídas adicionais além de stdin (0), stdout (1) e stderr (2) a um ambiente bash, o que às vezes é mais conveniente do que alternar constantemente para onde você está redirecionando a saída. Os # 's no () próximo aos 3' std 'inputs / outputs no bash são seus' descritores de arquivo ', embora raramente sejam referidos dessa forma no bash - mais frequentemente em C, mas mesmo assim existem constantes definidas que abstraem as coisas daqueles números, por exemplo STDOUT_FILENO é definido como 1 em unistd.h - ou stdlib.h ...

Digamos que você tenha um script que já esteja usando stdin e stdout para fazer a interface com o terminal de um usuário. Você pode abrir arquivos adicionais para leitura, gravação ou ambos, sem afetar os fluxos stdin / stdout. Aqui está um exemplo simples; basicamente o mesmo tipo de material que estava no link tldp.org acima.

#!/bin/bash -
#open a file for reading, assign it FD 3
exec 3</path/to/input.file
#open another file for writing, assign it FD 4
exec 4>/path/to/output.file
#and a third, for reading and writing, with FD 6 (it's not recommended to use FD 5)
exec 6<>/path/to/inputoutput.file

#Now we can read stuff in from 3 places - FD 0 - stdin; FD 3; input.file and FD 6, inputoutput.file
# and write to 4 streams - stdout, FD 1, stderr, FD 2, output.file, FD 4 and inputoutput.file, FD 6

# search for "something" in file 3 and put the number found in file 4
grep -c "something" <&3 >&4

# count the number of times "thisword" is in file 6, and append that number to file 6
grep -c "thisword" <&6 >>&6

# redirect stderr to file 3 for rest of script
exec 2>>&3

#close the files
3<&-
4<&-
6<&-
# also - there was no use of cat in this example. I'm now a UUOC convert.

Espero que faça mais sentido agora - você realmente tem que brincar um pouco com isso. Basta lembrar o mantra POSIX - tudo é um arquivo. Então, quando as pessoas dizem que < é realmente aplicável apenas em arquivos, não é que isso limita um problema no Linux / Unix; se algo não é um arquivo, você pode facilmente fazer com que pareça e aja como um.

    
por 16.05.2016 / 09:54
1

Ele redireciona o arquivo após < para o stdin do programa antes de < .

foo < bar

executará o programa foo usando o arquivo bar como seu stdin.

    
por 16.05.2016 / 09:50