Defina dois ou mais arquivos para execução (via source) de uma maneira confortável para ler

0

Eu usei o seguinte modo para executar uma coleção de arquivos de script Bash, na sessão atual do Bash:

source ~/myScripts/{assignments.sh,nginx_conf.sh,php_conf.sh,drush_install.sh}

Sinto-me desconfortável de manter. Alguma coleção vertical é melhor. Pseudocódigo:

assignments.sh
nginx_conf.sh
php_conf.sh
drush_install.sh

Como você faria isso verticalmente?

A propósito, não tenho certeza de que uma fonte aqui - documento como este seja a melhor maneira .

Atualizar

Agora entendo que minha operação de source de uma linha estava fadada ao fracasso porque a partir do Bash 4.3.48 (1), o interpretador do Bash avalia source de tal forma que só poderia trabalhar com um arquivo, e qualquer outro arquivo além dele, será avaliado como um argumento para o primeiro arquivo (um conjunto de chave {} não ajudaria com isso).

Eu tenho a impressão de que isso é o mesmo que com bash em vez de source .

    
por user9303970 07.02.2018 / 06:27

1 resposta

5

Um heredoc coloca cada nome de arquivo em sua própria linha sem qualquer outra coisa (apesar de assumir que os nomes de arquivos não contêm nada louco como uma nova linha) e permite uma ordenação específica dos nomes de arquivos:

while read f; do
   source ~/myScripts/"$f"
done <<SRC_LIST
assignments.sh
nginx_conf.sh
php_conf.sh
drush_install.sh
so_forth.sh
SRC_LIST

isso também evita o problema de source file [arguments] , onde os nomes de arquivos subseqüentes seriam tratados como argumentos para assignments.sh (a menos que você quisesse dizer que os argumentos subseqüentes seriam ??). A lista precisaria ser atualizada manualmente com o que está no sistema de arquivos.

Outra opção seria pular o tédio de listar os arquivos e globá-los; isso pressupõe que todos os arquivos correspondentes no diretório podem e devem ser originados (portanto, não misturar em outros arquivos *.sh aleatórios que não devem ser originados). No entanto, isso é complicado pelo caso extremo de quando nenhum arquivo é correspondido pelo glob, em cujo caso bash passará por padrão o nome literal do arquivo ~/myScripts/*.sh in para ser originado, então isso deve ser contornado (temporariamente, se necessário) e nada originário se não houver correspondências:

REVERT=$(shopt -p nullglob)
shopt -s nullglob
for f in ~/myScripts/*.sh; do
    source "$f"
done
$REVERT

com esse método, os nomes de arquivos precisariam ser nomeados de forma que o glob os correspondesse em uma ordem correta se houvesse uma ordem na qual os arquivos precisem ser originados. (No ZSH, não seria necessário o shopt chamadas em vez disso, for f in ~/myScripts/*.sh(N); do seria suficiente para realizar uma globulação nula. Outros shells irão variar na forma como eles lidam com globs e o que fazer quando nada corresponder.)

    
por 07.02.2018 / 06:40