Você está usando duas coisas diferentes aqui e deveria estar usando uma terceira. Vamos ver:
-
|
: Este é o operador pipe , serve para passar a saída de um processo como entrada para outro:foo | bar
Isso executa o programa
foo
e passa sua saída como entrada para o programabar
. -
>
,<
,>>
e<<
: estes são os operadores de redirecionamento , eles servem para enviar dados para / de arquivos :-
foo > bar
: executa o programafoo
e salva sua saída no arquivobar
, sobrescrevendo 1 seu conteúdo e criá-lo se não existir. -
foo >> bar
: executa o programafoo
e salva sua saída no arquivobar
, acrescentando ao seu conteúdo e criando-o se não existe. -
foo < bar
: executafoo
, informando para ler a entrada do arquivobar
. -
O
<<
é um caso especial, já que não há sentido em acrescentar "" entrada a um comando, o<<
é principalmente (exclusivamente AFAIK) usado para Aqui Documentos :$ cat << EOF > file.txt > Hello World! > EOF
A construção
<< SomeStringHere > Out.file
redirecionará todo o texto gravado até encontrar a sequência final (EOF
no exemplo acima) no arquivo de destino. Aqui, os documentos permitem que você formate facilmente sequências de várias linhas e inclua variáveis e caracteres especiais.
-
-
O operador
<<<
, o Aqui String , é como um Aqui Documento, mas expande as variáveis. Então, por exemplo:grep foo <<< "$bar"
O comando acima é equivalente a
echo "$bar" | grep foo
. -
O que você está realmente procurando é chamado processo de substituição e é outra maneira de passar a saída de um comando para outro. Consiste em
<(command)
.foo <(bar)
Então, para o seu exemplo
at
, você poderia fazerat now < <(echo "notify-send HELLO")
O procedimento acima funciona porque a substituição do processo realmente cria um arquivo (leia o link acima para mais detalhes) e é o descritor de arquivo daquele arquivo que é passado com
<
toat now
.
1 O comportamento padrão é sobrescrever, isso pode ser modificado pela configuração da opção noclobber
para bash. Se definido, echo foo > bar
falhará se bar
existir. Nesse caso, ele pode ser forçado usando echo foo |> bar
. Consulte a seção 3.6.2 aqui .