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 source
os 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 echo
ou 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-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
Correr com:
$ ./project-env subtool
Isso irá automaticamente cd
para a subpasta do projeto abaixo $HOME/projects
, lerá um arquivo de ambiente do projeto chamado subtool.env
neste caso (no qual você inicializa variáveis), fornecerá um prompt de linha de comando para o projeto e deixará você em uma bash
sessã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() { ...; }