Como saber qual parâmetro está sendo fornecido para um comando com um operador redirectioin?

8

Isso funciona:

  

$ echo "notificar-enviar OLÁ" | agora

Isso não acontece:

  

$ agora & lt; echo "notificar-enviar OLÁ"

Diz "arquivo ou diretório não encontrado".

Eu entendo que há uma opção -f neste comando, com o qual eu posso fornecer o arquivo a ser executado em um determinado momento.

Então, isso me fez pensar ... em geral, como eu sei para qual parâmetro os operadores de redirecionamento fornecem o valor?

    
por vlad-ardelean 14.04.2014 / 20:51

2 respostas

15

Você está usando duas coisas diferentes aqui e deveria estar usando uma terceira. Vamos ver:

  1. | : 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 programa bar .

  2. > , < , >> e << : estes são os operadores de redirecionamento , eles servem para enviar dados para / de arquivos :

    • foo > bar : executa o programa foo e salva sua saída no arquivo bar , sobrescrevendo 1 seu conteúdo e criá-lo se não existir.

    • foo >> bar : executa o programa foo e salva sua saída no arquivo bar , acrescentando ao seu conteúdo e criando-o se não existe.

    • foo < bar : executa foo , informando para ler a entrada do arquivo bar .

    • 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.

  3. 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 .

  4. 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 fazer

    at 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 < to at 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 .

    
por terdon 14.04.2014 / 21:08
12

Nesse caso, echo "notify-send HELLO" é um processo e não um arquivo - então você precisa de um substituição de processos em vez de redirecionamento de arquivos

at now < <(echo "notify-send HELLO")

Você também pode ter usado uma string aqui para evitar que o comando echo seja

at now <<< "notify-send HELLO"
    
por steeldriver 14.04.2014 / 21:05