Bash: Uma estrutura semelhante a uma função que não requer uma chamada? [fechadas]

0

Eu desejo algum tipo de estrutura de dados que se pareça com uma função Bash, mas não seja uma função. Uma estrutura named para organizar comandos por contexto, que também deve permitir guias principais.

Isso é legal quando você tem um arquivo com 20 funções de Bash, mas não precisa de 20 linhas de chamadas de função.

Comparação:

Função de bash:

x() {
    echo "x"
}
x

A estrutura de dados que eu procuro:

context {
    echo "x"
}

Eu organizo os comandos em tal célula de dados de forma semelhante a como eu iria organizá-lo com uma função, mas sem parênteses de parâmetro () e sem uma chamada de função.

Qual é o nome dessa estrutura e como você faria isso?

Notas

  • O nome da estrutura deve sempre vir antes dela, na mesma linha, assim como com uma função.

  • Um documento aqui não é uma solução, neste caso, desejo algo mais mínimo por meio da sintaxe.

por user9303970 16.02.2018 / 11:31

2 respostas

3

É chamado de comando composto e a sintaxe é

{ compound-list; }

(este é um exemplo de um comando composto, outras coisas como for loops, etc. também são comandos compostos)

Por exemplo:

{
    echo 'hello'
    echo 'world'
}

O ; só é necessário se não houver uma nova linha antes do final } :

{ echo 'hello'; echo 'world'; }

Os comandos na construção { ...; } são executados no ambiente atual , assim como para uma função.

Mais informações sobre isso estão disponíveis em a descrição do padrão POSIX de comandos compostos .

Não há razão (ou possibilidade) para nomear essas seções, já que nomear essa seção é mais ou menos equivalente a criar uma função shell de qualquer maneira. A nomeação de um comando composto seria, além disso, apenas necessária se for para ser referido posteriormente, para que servem as funções.

Os comentários podem obviamente ser usados:

# my hello world thing
{
    echo 'hello'; echo 'world'
}

De maneira similar, um subshell pode ser encontrado com

(
    echo 'hello'
    echo 'world'
)

Isso é executado em um ambiente filho para o shell atual e as alterações em variáveis etc. não serão refletidas no shell atual.

A sintaxe geral é

( compound-list )

Aqui, não há necessidade de um ; final antes de ) .

Como curiosidade, as funções do shell podem usar (...) no lugar de {...;} para executar seu código em um ambiente local:

helloworld () (
    echo 'hello'
    echo 'world'
)

Isso pode ser útil para saber se alguém está escrevendo uma função em uma linguagem sh que não suporta variáveis locais ( local ou typeset em bash ) e que não precisa modificar o ambiente do script .

    
por 16.02.2018 / 11:55
1

Os comentários são suficientes?

Você pode usá-los da seguinte maneira para reagrupar comandos e fornecer um nome a esses grupos, e nada o impede de usar recuo:

#context1
    echo "I'm in context1"
#end of context1

#context2
    echo "I'm in context2"
#end of context2

Você também pode reagrupar comandos com {...} , o que não teria nenhum outro efeito neste contexto. AFAIK:

#context1
{
    echo "I'm in context1"
}
#end of context1


{ #context2
    echo "I'm in context2"
} #end of context2

Se você quiser além de associar esses contextos a um escopo local, poderá usar subshells:

#context1
(
    context="context1"
    echo "I'm in $context"
)
#end of context1

( #context2
    echo "I'm in $context" #context is undefined there
    context=context2
    echo "I'm in $context"
) #end of context2

experimente aqui

    
por 16.02.2018 / 11:49