source some_file
some_file:
doit ()
{
echo doit $1
}
export TEST=true
Se eu for fonte de algum arquivo, a função "doit" e a variável TEST estarão disponíveis na linha de comando. Mas executando este script:
script.sh:
#/bin/sh
echo $TEST
doit test2
Retornará o valor de TEST, mas gerará um erro sobre a função desconhecida "doit".
Também posso "exportar" a função ou tenho que usar algum_arquivo no script.sh para usar a função lá?
#!/bin/sh
para#!/bin/bash
e depoisdoit() {...}
apenasexport -f doit
#!/bin/sh
, mas é uma boa prática usá-#!/bin/bash
lo para evitar problemas quando o shell padrão não é o bash.Respostas:
No Bash, você pode exportar definições de funções para sub-shell com
Por exemplo, você pode tentar este exemplo simples:
./script1
:./script2
:Então, se você ligar
./script1
, verá a saída Olá! .fonte
"Exportar" uma função usando
export -f
cria uma variável de ambiente com o corpo da função. Considere este exemplo:Isso significa que apenas o shell (apenas Bash?) Poderá aceitar a função. Você também pode definir a função, pois o Bash considera apenas os envvars começando com
() {
como function:Se você precisar "exportar" essa variável pelo SSH, precisará realmente da função como uma string. Isso pode ser feito com a opção de impressão (
-p
) para funções (-f
) dodeclare
built-in:Isso é muito útil se você tiver um código mais complexo que precise ser executado no SSH. Considere o seguinte script fictício:
fonte
fn2='() { echo Hi;}' sh -c fn2
não funcionou para mim. No arch linux comsh
bash v5.0.7 eu conseguish: fn2: command not found
. No Ubuntu, comsh
sendo traço v0.2.3 eu conseguish: 1: fn2: not found
. Qualsh
shell você usou?f(){ echo a;}; export -f f; echo "$f"; sh -c 'printenv f; echo "$f"'
não imprime nada para mim, portanto, claramentef
não é exportado como uma sequência simples. Eu testei com as duas combinações mencionadas acima.sh
executar essa sequência como uma função? No seu exemplo,fn2='() { echo Hi;}' sh -c fn2
o comandofn2
dadosh
é literalmente a string"fn2"
.sh
deve procurar esse comando em seu PATH, mas não deve procurar se há uma variável$fn2
, expandir essa variável e executar seu valor como uma função - parece-me um grande problema de segurança. edit: Eu acho que é isso! Seu comportamento demonstrado foi o bug de segurança conhecido como ShellShock / Bashdoor ?fn(){ echo foo; }; export -f fn; env | grep foo
saídasBASH_FUNC_fn%%=() { echo foo
Com base na resposta de @ Lekensteyn ...
Se você usá-
declare -pf
lo, exibirá todas as funções definidas anteriormente no shell atual para STDOUT.Nesse ponto, você pode redirecionar o STDOUT para onde quiser e, com efeito, colocar as funções definidas anteriormente onde quiser.
A resposta a seguir os colocará em uma variável. Em seguida, repetimos essa variável mais a invocação da função que queremos executar no novo shell que é gerado como um novo usuário. Fazemos isso usando
sudo
o comutador-u
(aka.user
) E simplesmente executando o Bash (que receberá o STDOUT canalizado como a entrada a ser executada).Como sabemos que estamos passando de um shell Bash para um shell Bash, sabemos que o Bash interpretará corretamente as funções definidas pelos shells anteriores. A sintaxe deve estar correta desde que nos movamos entre um shell Bash da mesma versão para um novo shell Bash da mesma versão.
YMMV se você estiver se deslocando entre diferentes shells ou entre sistemas que podem ter versões diferentes do Bash.
fonte
Você não pode exportar funções, não da maneira que está descrevendo. O shell carregará o
~/.bashrc
arquivo apenas no início de um shell interativo (procure "Invocação" na página de manual do bash ).O que você pode fazer é criar uma "biblioteca" que é carregada quando você inicia o programa:
E coloque suas funções e configurações não interativas lá.
fonte
BASH_ENV
a variável de ambiente para quesome_file
você já tenha, e isso seria chamado. Seria fácil descobrir isso:echo echo foobar > /tmp/foobar; BASH_ENV=/tmp/foobar $SHELL -c :
eval "$(declare -F | sed -e 's/-f /-fx /')"
exportará todas as funções.Faço isso muito antes de iniciar um shell interativo em um script para me permitir depurar e trabalhar no contexto do script enquanto uso suas funções e variáveis.
Exemplo:
fonte
As funções não são exportadas para subprocessos. É por isso que existem arquivos denominados .kshrc ou .bashrc: para definir funções que também devem estar disponíveis em subshells.
Se estiver executando um script, os scripts. * Shrc normalmente não são originados. Você teria que codificar isso explicitamente, como em
. ~/.kshrc
.fonte
rm=rm -i
)Bem, eu sou novo no Linux, mas você pode tentar isso. Em algum arquivo, vamos chamá-lo de 'tmp / general', você cria sua função:
No seu script de shell, adicione:
e corra:
Você vai ter na tela:
func from general
.fonte
Mais informações
fonte