No começo eu estava procurando o motivo que which
não produzia nada depois de dar certos programas como um argumento, por exemplo cd
.
Pelo que eu encontrei aqui , a razão provavelmente é que cd
na minha máquina é uma função, que é confirmada pela execução type cd
.
TLDR: Mas como programas normais que which
podem localizar graças a $PATH
variáveis são colocados em uma dessas $PATH
pastas, onde estão as funções ou scripts como cd
armazenados?
user@linuxmchine:~$ type cd
cd is a function
cd ()
{
__zsh_like_cd cd "$@"
}
linux
bash
shell-script
Gabrijel Šimunović
fonte
fonte
cd is a shell builtin
. Dê uma olhada na página man do seu shell (zsh?)Respostas:
Funções definidas pelo usuário
Normalmente, as funções bash são permanentemente armazenadas em um
bash
script de inicialização./etc/profile
para shells de login e/etc/bashrc
para shells interativos.~/.bash_profile
para shells de login e~/.bashrc
para shells interativos.man
página bash da seção INVOCATION.As funções de shell definidas pelo usuário são carregadas dinamicamente em um hash (ou tabela de consulta) quando o bash é iniciado. No arquivo de origem do bash,
variable.c
a definição da tabela é:Funções definidas pelo usuário podem ser listadas com o
declare
comando bash , outras shells ainda usamtypeset
. No bashdeclare
, substituiu otypeset
comando.As funções existem na memória pelo tempo de vida do shell bash.
Funções definidas (incorporadas) da Shell
Estas são funções comuns, tais como
echo
,printf
,cd
e:
. Eles são compilados em uma biblioteca que está vinculada aobash
executável. 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 nos.def
arquivos de origem que são analisados em código-fonte C) são mantidas nobuiltins
diretório da origem do bash.Um útil à parte: para informações sobre o uso de um comando interno do shell
help <command>
. por exemplofonte
typeset
que mostraria que arquivo / script causou a criação / mudança de uma função?declare
outypeset
para exibir o arquivo de origem de uma definição de função. Eu acho que é um problema de engenharia de software. Recentemente encontrei uma função de shell definida em um.alias
arquivo - não o que eu esperava!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 em qualquer forma utilizável até o shell é iniciado (por exemplo, quando você entra em um CLI, ou iniciar uma janela de shell como
xterm
) e eles são definidos (por exemplo, através da leitura.bashrc
,.bash_profile
ou algo similar) e deixam de existe quando o shell termina.fonte
cd () { pwd; builtin cd "$@"; }
no prompt, o único local armazenado estará na memória do seu shell em execução no momento. (Meu exemplo é Bash, mas o mesmo princípio se aplica a qualquer shell.)cd
e outros comandos comuns comoecho
,type
ealias
são chamados de builtins .Os comandos internos estão contidos dentro do próprio shell e shells diferentes podem ter diferentes comandos internos.
fonte
cd
está contido dentro do próprio programa shell, por exemplo, dentro do arquivo,/bin/bash
se este for o seu shell. (Eu acho que o seu texto aqui é claro, mas eu vi pessoas ficarem confusas com todos os tipos de coisas.)A questão do super usuário Encontrar a definição de uma função bash está intimamente relacionada a esta. O usuário HairOfTheDog forneceu esta resposta (parafraseada):
O acima pode funcionar apenas em
bash
e não em shells POSIX em geral.Graças a framboesa azul para encontrar isso!
fonte