Isso funciona:
$ echo "notificar-enviar OLÁ!" | agora
Isto não:
$ at now <echo "notificar-enviar OLÁ!"
Diz 'arquivo ou diretório não encontrado ".
Entendo que existe uma -f
opção para esse comando, com o qual posso fornecer o arquivo a ser executado em um determinado momento.
Então isso me fez pensar ... em geral, como sei para qual parâmetro os operadores de redirecionamento fornecem o valor?
command-line
bash
vlad-ardelean
fonte
fonte
foo | bar
ebar < foo
é equivalente. Eles não são.Respostas:
Você está usando duas coisas diferentes aqui e deve usar uma terceira. Vamos ver:
|
: Este é o operador do tubo , que serve para passar a saída de um processo como entrada para outro: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 de / para arquivos :foo > bar
: executa o programafoo
e salva sua saída no arquivobar
, substituindo 1 seu conteúdo e criando-o se ele não existir.foo >> bar
: executa o programafoo
e salva sua saída no arquivobar
, anexando ao seu conteúdo e criando-o se ele não existir.foo < bar
: é executadofoo
, dizendo para ler a entrada do arquivobar
.Esse
<<
é um caso especial, já que não há sentido em "anexar" a entrada a um comando, ele<<
é principalmente (exclusivamente AFAIK) usado para o Here Documents :A construção
<< SomeStringHere > Out.file
redirecionará todo o texto escrito até encontrar a sequência final (EOF
no exemplo acima) para o arquivo de destino. Aqui, os documentos permitem formatar facilmente seqüências de várias linhas e incluir variáveis e caracteres especiais.O
<<<
operador, a Cadeia de caracteres Here , é como um documento Here, mas expande variáveis. Então, por exemplo:O comando acima é equivalente a
echo "$bar" | grep foo
.O que você está realmente procurando é chamado substituição de processo e é outra maneira de passar a saída de um comando para outro. Consiste em
<(command)
.Então, para o seu
at
exemplo, você poderia fazerO procedimento acima funciona porque a substituição do processo realmente cria um arquivo (leia o link acima para obter mais detalhes) e é o descritor de arquivo desse arquivo que é passado
<
paraat now
.1 O comportamento padrão é substituir, isso pode ser modificado definindo a
noclobber
opção bash. Se definido,echo foo > bar
falhará sebar
existir. Nesse caso, ele pode ser forçado usandoecho foo |> bar
. Veja a seção 3.6.2 aqui .fonte
<<
e<<<
(que @steeldriver mencionou em sua resposta). Além disso, há mais - algo como>>>>>>
ou<<<<<<<<<<
?<<<
:)Nesse caso,
echo "notify-send HELLO"
um processo não é um arquivo - portanto, você precisa de uma substituição de processo e não de um redirecionamento de arquivoVocê também pode ter usado uma string here para evitar o
echo
comando inteiramentefonte