Onde as funções do shell são armazenadas no Linux?

11

No começo, eu estava procurando o motivo pelo qual which não produza nada depois de dar a ele determinados programas como um argumento, por exemplo, %código%.

Do que eu encontrei aqui , provavelmente a razão é que cd na minha máquina é uma função, o que é confirmado executando cd .

TLDR: Mas como os programas normais que type cd podem localizar graças à variável which são colocados em uma daquelas pastas $PATH , onde estão funções ou scripts como $PATH armazenados?

user@linuxmchine:~$ type cd
cd is a function
cd () 
{ 
    __zsh_like_cd cd "$@"
}
    
por Gabrijel Šimunović 29.12.2014 / 22:43

4 respostas

12

Funções definidas pelo usuário

Normalmente, as funções bash são permanentemente armazenadas em um script de inicialização bash .

  • Scripts de inicialização em todo o sistema: /etc/profile para os cascos de login e /etc/bashrc para os cascos interativos.
  • O usuário define os scripts de inicialização: ~/.bash_profile para os shells de login e ~/.bashrc para os shells interativos.
  • Mais informações sobre shells interativos / de login podem ser encontradas na página bash man na seção INVOCATION.

As funções shell definidas pelo usuário são carregadas dinamicamente em um hash (ou tabela de consulta) quando o bash é iniciado. A partir do arquivo de origem do bash variable.c , a definição da tabela é:

/* The list of shell functions that the user has created, or that came from
   the environment. */
HASH_TABLE *shell_functions = (HASH_TABLE *)NULL;

Funções definidas pelo usuário podem ser listadas com o comando bash declare , outras camadas ainda usam typeset . No bash declare substituiu o comando typeset .

declare -f

As funções existem na memória pelo tempo de vida do shell bash.

Funções definidas (incorporadas) da Shell

Essas são funções comuns, como echo , printf , cd e : . Eles são compilados em uma biblioteca que está vinculada ao executável bash . Construir as definições no executável economiza tempo comparado ao carregamento de uma definição externa. As definições para essas funções (mantidas em .def arquivos de origem que são analisados em código-fonte C) são mantidas no diretório builtins da origem do bash.

Um lado útil: para obter informações sobre um comando interno do shell, use help <command> . por exemplo.

help                # list all builtins
help declare        # info and options for declare
help -m declare     # gives man style information for declare
    
por 29.12.2014 / 23:58
8

As funções do Shell são armazenadas na memória do shell (ou, talvez, em arquivos temporários não documentados). Eles não existem de nenhuma maneira utilizável até que o shell comece (por exemplo, quando você faz login em uma CLI ou inicia uma janela de shell como xterm ) e eles são definidos (por exemplo, lendo .bashrc , .bash_profile ou algo similar) e eles deixam de existir quando o shell termina.

    
por 30.12.2014 / 00:01
6

cd e outros comandos comuns, como echo , type & alias são chamados de builtins .

Os comandos internos estão contidos dentro do próprio shell e diferentes shells podem ter diferentes comandos incorporados.

    
por 29.12.2014 / 22:58
1

A questão do super usuário Encontrando a definição de uma função bash está intimamente relacionado com este. Usuário HairOfTheDog fornecido esta resposta (parafraseado):

The following commands will report the location (filename and line number) of a function’s definition.  Assuming a function named foo,

# Turn on extended shell debugging
shopt -s extdebug

# Display the function’s name, line number and fully qualified source file
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug
     

Por exemplo, a saída desses comandos pode ser:

     
foo 32 /source/private/main/developer/cue.pub.sh

O acima pode funcionar apenas em bash , e não em shells POSIX em geral.

Agradecemos a Blue Raspberry por encontrar isto!

    
por 20.03.2017 / 11:17