Como auto fonte um script de shell?

3

Como fazer um script de shell executar seus comandos como comandos de origem sem ter que usar a expressão "source scriptname.sh" para iniciar o script? Basicamente, o que eu quero é digitar ./ scriptname.sh e seus comandos agem como se source fosse usado para executar o shell-script.

    
por Andrei George Hondrari 05.12.2012 / 16:38

3 respostas

4

Nenhum dos shells Unix permite que você marque um script como um que sempre deve ser originado da maneira que você espera. O que eu faria é criar um alias ou um procedimento para fazer o que você quer e colocá-lo no meu script de inicialização. Por exemplo, em tcsh:

alias scriptname source \!\!

No bash, você poderia escrever como um procedimento:

scriptname( ) { source scriptname.sh $*; }
    
por 05.12.2012 / 17:20
0

Você pode usar um recurso de bash que permite interceptar a entrada do usuário e agir sobre ela, substituindo qualquer execução de comando usual.

Adicione o seguinte ao seu script de inicialização bash :

shopt -s extdebug
function auto_source_names {
    local CMD=$BASH_COMMAND
    if [[ -f "$CMD" ]] && [[ ! -x "$CMD" ]] ; then
        source "$CMD"
        return 1
    else
        return 0
    fi
}
trap 'auto_source_names' DEBUG

Isso faz com que a função seja chamada para todos os comandos executados. Se for o nome de um arquivo que não é executável (caso contrário, também bloquearíamos as chamadas ./foo.sh legítimas), ele será originado e nenhum comando será executado. Esteja ciente dos arquivos chamados ls ou rm no mesmo diretório. Você pode adicionar proteções adicionais, por exemplo requerendo .sh extensão de arquivo ou file informando que o nome é um arquivo de texto.

Exemplo:

Crie foo.sh :

FOO=bar

Então:

$ echo $FOO
$ foo.sh
$ echo $FOO
bar
    
por 05.12.2012 / 18:55
-3

A primeira linha precisa conter o caminho para o interpretador:
#! /bin/bash

Em seguida, torne o arquivo de script executável:
chmod +x scriptname.sh

Agora você pode executar ./scriptname.sh para executá-lo.

    
por 05.12.2012 / 16:53