Por que o cd não é um programa?

120

Sempre me perguntei por que cd não é um programa, mas nunca conseguiu encontrar a resposta.

Alguém sabe por que esse é o caso?

    
por AkshaiShah 16.05.2012 / 21:39

7 respostas

166

O comando cd modifica o "diretório de trabalho atual", certo?

"diretório de trabalho atual" é uma propriedade exclusiva de cada processo.

Então, se cd fosse um programa, funcionaria assim:

  1. cd foo
  2. o processo cd é iniciado
  3. o processo cd altera o diretório para o processo de cd
  4. o processo cd sai
  5. seu shell ainda tem o mesmo estado, incluindo o diretório de trabalho atual, que ele fez antes de você começar.
por 16.05.2012 / 21:41
104

cd além de ser um shell embutido, também é um programa em sistemas operacionais compatíveis com POSIX. Eles devem fornecer executáveis independentes para utilitários regulares, como cd . Este é, por exemplo, o caso do Solaris , AIX , HP-UX e OS X .

Obviamente, um cd embutido ainda é obrigatório, pois sua implementação externa não altera o diretório atual do shell. No entanto, o último ainda pode ser útil. Aqui está um exemplo mostrando como o POSIX visualiza como esse comando cd pode ser usado:

find . -type d -exec cd {} \;

Em um sistema POSIX, este oneliner reportará uma mensagem de erro para todos os diretórios que você não tem permissão para cd in. Na maioria das distribuições do Gnu / Linux, ele falha com essa mensagem de erro:

find: 'cd': No such file or directory

E aqui está a resposta para sua pergunta, " Por que o cd não é um programa? " de um dos co-autores originais do Unix. Em uma implementação muito antiga do Unix, cd (escrito chdir na época) era um programa externo. Ele parou de funcionar inesperadamente depois que fork foi implementado pela primeira vez.

Citações Dennis Ritchie :

In the midst of our jubilation, it was discovered that the chdir (change current directory) command had stopped working. There was much reading of code and anxious introspection about how the addition of fork could have broken the chdir call. Finally the truth dawned: in the old system chdir was an ordinary command; it adjusted the current directory of the (unique) process attached to the terminal. Under the new system, the chdir command correctly changed the current directory of the process created to execute it, but this process promptly terminated and had no effect whatsoever on its parent shell! It was necessary to make chdir a special command, executed internally within the shell. It turns out that several command-like functions have the same property, for example login.

Fonte: Dennis M. Ritchie, “ A Evolução do Sistema de Compartilhamento de Tempo Unix ”, AT & T Bell Laboratories Technical Journal 63 (6), Parte 2, out. 1984, pp.1577–93

Unix Versão 1 (março de 1971) chdir página de manual afirma:

Como um novo processo é criado para executar cada comando, chdir seria ineficaz se fosse escrito como um comando. Portanto, é reconhecido e executado pelo Shell.

    
por 16.05.2012 / 22:44
46

A partir da introdução do Bash ( O que é um shell? ):

Shells also provide a small set of built-in commands (builtins) implementing functionality impossible or inconvenient to obtain via separate utilities. For example, cd, break, continue, and exec) cannot be implemented outside of the shell because they directly manipulate the shell itself. The history, getopts, kill, or pwd builtins, among others, could be implemented in separate utilities, but they are more convenient to use as builtin commands. All of the shell builtins are described in subsequent sections.

    
por 16.05.2012 / 22:03
28

Para o April Fool deste ano, eu escrevi uma versão independente de cd .

Ninguém entendeu a piada. Suspiro.

Qualquer um que não tenha certeza de que cd deve ser incorporado ao shell, deverá fazer o download, compilá-lo e testá-lo.

Leia também sua página de manual. :)

    
por 17.05.2012 / 03:09
4

O comando cd no shell não pode ser um processo separado porque no Unix não há mecanismo para alterar o diretório de trabalho atual de um processo diferente (nem mesmo o processo pai).

Se cd fosse um processo diferente, seria necessário alterar o diretório de trabalho atual de seu pai (shell), o que não é possível no Unix. Em vez disso, cd é um comando interno especial. O shell chama funções como chdir() e fchdir() alterando seu próprio diretório de trabalho atual.

Nota: o kernel armazena o número de inode do diretório de trabalho atual para cada processo. O processo filho herda de cwd de seu pai.

    
por 27.06.2015 / 09:23
0

cd é um comando interno do shell. Tão fácil como é. O cd do homem diz tudo. o comando cd altera o diretório de trabalho para todos os interpretadores e (em um ambiente encadeado) todos os threads.

    
por 17.05.2012 / 01:34
-1

Acho que uma coisa que falta na resposta das pessoas é que o diretório atual é uma variável de ambiente que cada programa pode alterar. Se você usar o comando 'export' para ver sua lista de variáveis de ambiente atual, você terá:

declare -x PWD="/home/erfan"

nos seus resultados. Assim, pelo comando 'cd', queremos apenas modificar essa variável interna. Eu acho que se tentarmos, podemos alterar a variável PWD de qualquer pty em shell, é claro. Como:

cder    #change current PTY $PWD variable

Mas acho que não há necessidade em casos normais. Em outra palavra, tomamos ajuda do bash (ou qualquer shell) para modificar sua variável interna definida.

    
por 17.05.2012 / 15:26