Como posso invocar uma função no script de shell bash

4

Pergunto-me se a distinção chama a função entre $(one_function) e one_function no script de shell bash.

Quando defino a variável PS1 em ~/.bashrc , não consigo invocar a função por one_func ex:

export PS1="\n\[\e[31m\] \$(one_func)  # it works 

export PS1="\n\[\e[31m\] one_func      # it doesn't work
    
por sufery 24.04.2010 / 22:42

3 respostas

5

Ao contrário de como as variáveis são acessadas, as funções são invocadas por nome sem precedê-lo com um '$'.

Você pode estar confuso sobre como na linha de comando, você pode definir uma função e invocar essa função pelo nome, mas no seu PS1 você deve colocar o comando entre parênteses precedido por um '\ $'. Colocar o nome da função em '$ (' e ')' faz com que todo o '$ (function)' seja substituído por qualquer que seja a saída padrão dessa função. Colocar a barra invertida na frente disso faz com que o seu shell avalie / execute essa função toda vez que quiser gerar $ PS1. Se você tivesse deixado a barra invertida, a função teria sido chamada apenas uma vez, quando você definiu o PS1 pela primeira vez, e qualquer que fosse a saída da função naquela primeira vez, estaria para sempre no prompt do PS1 a partir de então.

    
por 24.04.2010 / 23:44
1

Quando você invocar $(one_func) , ele executará a função e retornará a saída. Então, se você disser, por exemplo:

var=$(ls)

armazenará a saída do comando ls (ou seja, a lista de arquivos no diretório atual) na variável $var . Enquanto o comando:

var=ls

apenas definirá o valor de $var para "ls".

A propósito, chamar uma função no bash funciona da mesma maneira que executar um comando.

    
por 24.04.2010 / 23:36
0

Apenas para adicionar ao acima. informação muito útil ... a mesma ideia se aplica quando aninhando funções e chamando executáveis ...

PS1="# \e[1;30m\u\e[0;37m@\h: \e[1;31m\w\e[31m >\e[1;30m  \t \e[1;33m [ \$(kmg \$(totalfilesize.sh)) ]\e[m\n"

"kmg" é uma função bash que eu defini, e com esta sintaxe é passado um argumento da saída do script "totalfilesize.sh"

\$(kmg \$(totalfilesize.sh))

Se você está curioso, totalfilesize calcula o tamanho dos arquivos no diretório atual, e kmg converte a string (em bytes) para b, mB, gB, etc. legível por humanos.

    
por 21.03.2011 / 16:27