O que significa? [duplicado]

76

O que << < < significar? Aqui está um exemplo:

$ sed 's/a/b/g' <<< "aaa"
bbb

É algo geral que funciona com mais comandos do Linux?

Parece que está alimentando o programa sed com a string aaa , mas não é < < ou < geralmente usado para isso?

    
por Daniel Jonsson 22.06.2013 / 18:36

4 respostas

102

Outros responderam a pergunta básica: o que é isso?

Agora, por que é útil? Você também pode alimentar uma string para o stdin de um comando assim:

echo "$string" | command

No entanto, no bash, introduzir um pipe significa que os comandos individuais são executados em subshells. Considere isto:

echo "hello world" | read first second
echo $second $first

A saída do segundo comando echo imprime um único espaço. Whaaaa O que aconteceu com minhas variáveis? Como o comando read está em um pipeline, ele é executado em um subshell. Ele lê corretamente 2 palavras de seu stdin e atribui às variáveis. Mas então o comando é concluído, o subshell sai e as variáveis são perdidas.

Às vezes, você pode resolver isso com chaves:

echo "hello world" | {
    read first second
    echo $second $first
}

Tudo bem se a sua necessidade pelos valores estiver contida, mas você ainda não tem essas variáveis no shell atual do seu script. Para remediar esta situação confusa, use uma string here

read first second <<< "hello world"
echo $second $first

Ah, muito melhor!

    
por 22.06.2013 / 20:31
51

<<< indica uma string aqui.

$ cat <<< 'hi there'
hi there

Ele passa a palavra à direita para a entrada padrão do comando à esquerda.

<< denota um documento aqui.

$ cat <<EOF
> hi
> there
> EOF
hi
there

EOF pode ser qualquer palavra.

Aqui, documentos são comumente usados em scripts de shell para criar arquivos inteiros ou para exibir mensagens longas.

cat > some-file <<FILE
foo
bar
bar bar
foo foo
FILE

< passa o conteúdo de um arquivo para a entrada padrão de um comando.

$ cat < /etc/fstab
/dev/sda2               /boot   ext4            nosuid,noexec,nodev,rw,noatime,nodiratime       0 2
/dev/sda4               /       ext4            rw,noatime,nodiratime,  0 1
/dev/sdb5               /var    ext4            nosuid,noexec,nodev,rw,relatime 0 2
 ...
    
por 22.06.2013 / 19:40
9

Dê uma olhada na página de manual do Bash . Essa notação é parte do que é chamado de aqui documentos & aqui strings . Ele permite a capacidade de gerar entrada de dados de várias linhas como uma sequência contínua. A variação que você está perguntando é chamada de string .

trecho da página man do Bash

Here Strings
   A variant of here documents, the format is:

          <<<word

   The word is expanded and supplied to the command on its standard input.
    
por 22.06.2013 / 19:18
4

Isso significa aqui strings.

<<< strings

As strings são expandidas e fornecidas ao comando em sua entrada padrão.

No seu exemplo, as strings aaa são enviadas para o comando sed via stdin.

    
por 22.06.2013 / 18:42