Posso usar um shebang para ter uma fonte de arquivo no ambiente bash atual?

Posso usar um shebang para ter uma fonte de arquivo no ambiente bash atual?

Tenho uma coleção crescente deroteirosqualdeve ser originado, não executado. No momento eles têm a coisa

#! /bin/cat

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

$ . /path/to/script.sh

ou

$ source /path/to/script.sh

Mas .e sourceos bash são integrados, então é possível uma linha shebang alternativa para esses scripts?

Responder1

Não. Quando uma coisa entra em jogo, você já perdeu. Um shebang é aplicado quando um processo é exec()feito e normalmente isso acontece após a bifurcação, então você já está em um processo separado. Não é o shell que lê o shebang, é o kernel.

Responder2

O she-bang é interpretado pelo kernel quando um comando é executado, não pelo shell. Então, a essa altura, já é tarde demais.

Você pode fazer isso:

#! /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 dizer ao usuário o que ele fez de errado.

O que deve funcionar no Linux. Substitua todos os espaços, exceto o primeiro, 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 echoou sed.

Responder3

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

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

Suponho que eles definem variáveis ​​de ambiente que você usa para algum projeto.

Vamos chamar um projeto subtool(porque é um projeto que tenho). Então você poderia ter um script que configurasse um ambiente shell para projetos, project-envpor 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

Correr com:

$ ./project-env subtool

Isso irá automaticamente cdpara a subpasta do projeto abaixo $HOME/projects, lerá um arquivo de ambiente do projeto chamado subtool.envneste caso (no qual você inicializa variáveis), fornecerá um prompt de linha de comando para o projeto e deixará você em uma bashsessão interativa:

[subtool: subtool] $

Quando seu trabalho estiver concluído, simplesmente exit.

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

Responder4

As coisas que você deseja fazer nesses scripts .'ed estão alterando o processo do shell; então você precisa chamá-los do processo shell; o que significa apelidos ou funções de shell de seus irmãos mais poderosos. Isso significa que você precisa fazer algumas configurações em .profile ou equivalente.

O truque do alias é meio simplista: alias mytool1=". /my/library/mytool1.sh"

Você consegue ler tudo no começo? .perfil: . /my/library/define_tools.sh

define_mytools.sh: mytool1() { ... conteúdo de mytool1.sh ... } mytool2() { ...; }

informação relacionada