usando o comando source com o diálogo

0

Estou tentando criar um script grande com muitas funções que levam algum tempo. Eu gostaria de apresentar uma caixa de diálogo "sourcing please wait ..." neste meio tempo. uma vez feito sourcing eu quero usar minhas funções. mas usando o diálogo parece cancelar a acidificação. o sourcing é processado com o diálogo, mas a função não é executada.

arquivo: main.script.sh

#!/bin/bash

long task...

function PrintDate(){
date
}

arquivo: job1.sh

#!/bin/bash
source main.script.sh | dialog --progressbox "sourcing please wait..." 20 80
PrintDate

prompt de comando:

bash job1.sh

saída eu recebo

PrintDate: command not found
    
por Asaf Magen 26.02.2017 / 15:41

1 resposta

1

Nit escolhe:

  1. Seus "shebangs" estão errados - eles devem começar a #! .
  2. Você não precisa de um "shebang" em um arquivo que se destina a ser originado. Você pode querer deixá-lo de modo que fique claro que o arquivo destina-se a ser originado e não executado como um roteiro comum. (Especificamente, você provavelmente deve começar com um comentário que diga algo como # This file is meant to be sourced and not run as an ordinary script. )
  3. A rigor, você não precisa de um "shebang" em um arquivo que deve ser executado por bash scriptname , embora não doa.
  4. É claro que você está recebendo PrintDate: command not found . Seu arquivo main.script.sh não está definindo PrintDate ; está definindo PritnDate .

Mas a verdadeira resposta para sua pergunta é:

  1. O ponto inteiro de source é que o script de origem é lido e interpretado no atual processo de shell principal, mas quando você faz parte de um pipeline, você o força a executar em um processo filho.
  2. O truque é criar um pipe sem criar um pipeline. O truque para fazer isso é usando substituição de processo (uma extensão bash para comando de substituição ). Este comando:

    source main.script.sh > >(dialog --progressbox "sourcing please wait..." 20 80)
    

    criará um processo filho para executar o programa dialog , e criar um pipe a partir do processo de shell principal para esse processo filho, mas então isso faz com que o pipe pareça um arquivo comum, e envia a saída do comando source para o pipe enquanto faz com que pareça um redirecionamento comum da saída padrão. Portanto, o source é executado no processo de shell principal (que, nesse caso, é o processo bash que está executando o script job1.sh ) e assim suas funções são definidas no script job1.sh .

por 26.02.2017 / 22:32

Tags