Nit escolhe:
- Seus "shebangs" estão errados - eles devem começar a
#!
. - 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.
) - A rigor, você não precisa de um "shebang" em um arquivo
que deve ser executado por
bash scriptname
, embora não doa. - É claro que você está recebendo
PrintDate: command not found
. Seu arquivomain.script.sh
não está definindoPrintDate
; está definindoPritnDate
.
Mas a verdadeira resposta para sua pergunta é:
- 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. -
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 comandosource
para o pipe enquanto faz com que pareça um redirecionamento comum da saída padrão. Portanto, osource
é executado no processo de shell principal (que, nesse caso, é o processobash
que está executando o scriptjob1.sh
) e assim suas funções são definidas no scriptjob1.sh
.