Posso usar um shebang para ter uma própria fonte de arquivo no ambiente atual?

3

Eu tenho uma coleção crescente de scripts que deve ser originado, não executado . No momento eles têm o shebang

#! /bin/cat

mas eu preferiria que eles fossem originados no bash quando executados, da mesma forma que eu fiz

$ . /path/to/script.sh

ou

$ source /path/to/script.sh

Mas . e source são básicos, então é uma alternativa alternativa para tais scripts possíveis?

    
por jalanb 23.06.2016 / 07:52

4 respostas

10

Não. No momento em que um shebang entra em jogo, você já perdeu. Um shebang é aplicado quando um processo é exec() 'd e normalmente ocorre depois de bifurcado, portanto, você já está em um processo separado. Não é o shell que lê o shebang, é o kernel.

    
por 23.06.2016 / 08:00
4

Como o usuário @muru diz, não é possível fazer isso porque você já deixou a sessão do shell para trás quando chegar na #! -line.

No entanto, dependendo do que seus arquivos de shell fazem, pode haver outra solução.

Eu estou supondo que eles definem variáveis de ambiente que você usa para algum projeto.

Vamos chamar um projeto subtool (porque é um projeto que eu tenho). Então você poderia ter um script que configura um ambiente de shell para projetos, project-env por exemplo:

#!/bin/bash

PROJECT="$1"
PROJECT_ROOT="$HOME/projects/$PROJECT"

cd "$PROJECT_ROOT" || exit 1
source "$PROJECT.env"

export PS1="[$PROJECT: \W] \$ "
exec bash -i

Executar com:

$ ./project-env subtool

Isto irá automaticamente cd para a subpasta de projeto abaixo de $HOME/projects , leia um arquivo de ambiente de projeto chamado subtool.env neste caso (no qual você inicializa variáveis), dê um prompt de linha de comando para o projeto e deixe você em uma sessão bash interativa:

[subtool: subtool] $

Quando seu trabalho terminar, basta exit .

Isso também tem o benefício de isolar o ambiente do projeto da sua sessão de shell de login "comum" e de outros projetos.

    
por 23.06.2016 / 08:38
2

O she-bang é interpretado pelo kernel quando um comando é executado, não o shell. Então, nessa hora, é tarde demais.

Você pode fazer isso em vez disso:

#! /bin/echo Please run (from a Bourne-like shell): .

Ou:

#! /bin/sed 2,5!d;s/^#.//
# This script must be sourced from within a shell
# and not executed. For instance with:
# 
#   . path/to/that/script
rest of the script

Para informar ao usuário o que ele fez de errado.

Qual deve funcionar no Linux. Substitua todos, exceto o primeiro espaço, por um dos caracteres de espaçamento não ASCII (como U + 00A0, U + 2006 ...) em alguns outros sistemas operacionais. Talvez seja necessário adaptar o caminho dos utilitários echo ou sed .

    
por 19.03.2018 / 13:50
0

Qual é o seu ponto?

Você não quer que o script seja executado por conta própria? Se o script é destinado a ser originado, ele não deve ter o bit executável definido. Nem o shebang. Nem seja colocado em seu caminho.

Você está chateado por digitar esses dois caracteres extras adicionais, um ponto e um espaço, de uma sessão bash ao vivo? Basta definir um alias .

alias script.sh='. /path/to/script.sh'

E, assim como os executáveis em seu PATH, os aliases serão preenchidos automaticamente durante a digitação.

PS. Para a inclusão da sua coleção de scripts em crescimento, semelhante ao PATH, você poderia criar todos os aliases em seu ~ / .bashrc com algum trecho como:

for F in $(find /path/to/collection); do alias ${F##*/}=". $F"; done
    
por 19.03.2018 / 13:31