Em que pacote está o comando 'cd'?

21

Eu quero olhar para o código-fonte por trás do comando cd , mas cd não parece ter seu próprio pacote, de qual pacote ele está?

    
por muru 11.03.2016 / 15:45

5 respostas

54

Descubra que tipo um comando está usando o comando type .

$ type cd
cd is a shell builtin
$ type ls
ls is aliased to 'ls --color=auto'
$ type cat
cat is /bin/cat

Você pode ver que cd é um shell embutido .

Isto significa que é uma parte do seu shell que é por padrão Bash . É claro que também o pacote de software está contido.

Para comandos instalados que não são built-in de shell, mas arquivos executáveis, use dpkg -S para descobrir o pacote:

$ dpkg -S $(which cat)
coreutils: /bin/cat

Para obter ajuda para comandos incorporados, use o comando help (que também está embutido):

$ help cd
cd: cd [-L|[-P [-e]] [-@]] [dir]
    Change the shell working directory.

[... output shortened ...]
    
por Byte Commander 11.03.2016 / 15:59
24

cd é necessariamente um shell interno. Se o shell gerasse um processo filho que alterasse o diretório de trabalho e fosse encerrado, o processo pai (o próprio shell) não seria afetado.

Quanto ao código-fonte de cd , tudo o que ele precisa fazer é chamar chdir(2) , que altera o diretório de trabalho do processo. Veja chdir em opengroup.org que declara:

% bl0ck_qu0te%     
por Tim B 11.03.2016 / 16:47
18

Aqui está uma página de manual do cd , mas não oficial, pois cd faz parte do "Shell Comandos incorporados ". Assim como alguns outros comandos ...

alias, bg, bind, break, builtin, command, compgen, complete, 
continue, declare, dirs, disown, echo, enable, eval, exec, exit, 
export, fc, fg, getopts, hash, help, history, jobs, kill, let, local, 
logout, popd, printf, pushd, pwd, read, readonly, return, set, shift, 
shopt, source, suspend, test, times, trap, type, typeset, ulimit,
umask, unalias, unset, wait 

Veja a man page para bash . A partir do link cd states:

% bl0ck_qu0te% % bl0ck_qu0te%

Isso seria bash

    
por Rinzwind 11.03.2016 / 15:54
5

O código-fonte real de cd é para

  • Bash em builtins/cd.def no final do arquivo
  • TCSH em sh.dir.c as a função dochngd
  • PDKSH (escudo Korn em Domínio Público encontrado em alguns BSDs) em c_ksh.c no topo do arquivo
  • Korn 93 (Original shell Korn, versão antiga) em código%

A chamada de sys src/cmd/ksh93/bltins/cd_pwd.c para

  • O kernel do Linux está em chdir
  • FreeBSD é onde o link no início deste item aponta para
  • outros sistemas operacionais do tipo BSD e OpenSolaris funcionam de maneira bastante semelhante

Pode-se notar que as chamadas de sistema ainda não são o fim da cadeia, o que seria baixo no nível do sistema de arquivos individual.

    
por deamentiaemundi 13.03.2016 / 03:33
3

Certo, como todo mundo escreveu, cd está embutido em qualquer shell que você usa, porque um processo não pode afetar o diretório de trabalho de seu pai. cd tem alguns sinos e assobios (quero dizer pushd e amigos, cd sem discussão, etc.), mas se você se der ao trabalho de vasculhar a fonte, ficará desapercebido: o principal coisa é que cd chama a chamada do sistema chdir(2) .

Não há muito a ser visto porque, diferente de, digamos, uma variável de ambiente como HOME , o "diretório de trabalho" é primitivo do sistema: é um dos atributos de cada processo, como id de usuário (real) ou prioridade de agendamento . É o ponto de partida ao abrir arquivos com caminhos relativos.

    
por alexis 12.03.2016 / 22:14