Eu sempre me perguntei por que cd
não é um programa, mas nunca consegui encontrar a resposta.
Alguém sabe por que esse é o caso?
shell
command
cd-command
shell-builtin
AkshaiShah
fonte
fonte
cd
comando unix original era um programa separado. A concha lidou com isso especialmente porque nãofork
, apenasexec
. E quandocd
terminasse, seria execsh
. Não sei se é uma história verdadeira.chdir
syscall. fontes: v1 v5 v7 (primeira versão com shell Bourne)cd
que eu tinha lido. Eu estava claramente errado sobre o aspecto, agora que @jlliagre preencheu os detalhes.Respostas:
O
cd
comando modifica o "diretório de trabalho atual", certo?"diretório de trabalho atual" é uma propriedade exclusiva de cada processo.
Portanto, se
cd
fosse um programa, funcionaria assim:cd foo
cd
processo começacd
processo altera o diretório para o processo do CDcd
processo saifonte
cd
um programa funcionasse dessa maneira" deveria ser "quandocd
é usado na implementação de um programa externo, funciona assim".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, comocd
. Este é por exemplo o caso com Solaris , AIX , HP-UX e OS X .Obviamente, um built
cd
-in 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 prevê como essecd
comando pode ser usado:Em um sistema POSIX, este oneliner relatará uma mensagem de erro para todos os diretórios nos quais você não tem permissão para
cd
entrar. Na maioria das distribuições Gnu / Linux, ela falha com essa mensagem de erro: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
(escritochdir
naquela época), havia um programa externo. Ele parou de funcionar inesperadamente após afork
primeira implementação.Citando Dennis Ritchie :
Fonte: Dennis M. Ritchie, “ A evolução do sistema de compartilhamento de tempo Unix ”, AT&T Bell Laboratories Technical Journal 63 (6), Parte 2, outubro de 1984, pp.1577–93
A página 1 do manual do chdir do Unix versão 1 (março de 1971) afirma:
Como um novo processo é criado para executar cada comando, o chdir seria ineficaz se fosse gravado como um comando normal. É, portanto, reconhecido e executado pela Shell.
fonte
cd
executável independente , mas que ele não faça nada (exceto, possivelmente, emita mensagens de erro se chamado com os argumentos errados). Esquisito.Na introdução do Bash (o que é um shell? ):
fonte
Para o April Fool deste ano, escrevi uma versão independente de
cd
.Ninguém entendeu a piada. Suspiro.
Qualquer pessoa que não tenha certeza de que
cd
deve ser incorporada ao shell deve fazer o download, compilar e experimentar.Leia sua página de manual também. :)
fonte
/bin/cd
. Se você quiser pegar meu código e fazer disso sua própria busca pessoal, poderá fazê-lo.O
cd
comando 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 dissocd
é um especial construído no comando. O shell chama funções comochdir()
efchdir()
alterar 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 o herda
cwd
do pai.fonte
cd é um comando interno do shell. Tão fácil quanto é. O cd do homem diz tudo. o comando cd altera o diretório de trabalho para todos os intérpretes e (em um ambiente encadeado) todos os encadeamentos.
fonte
cd
é built-in. Eu sugiro que você leia as respostas mais bem classificadas e considere como sua resposta pode ser melhorada.Acho que uma coisa que falta na resposta das pessoas é que o diretório atual é uma variável de ambiente que cada programa pode mudar. Se você usar o comando 'export' para ver sua lista de variáveis de ambiente atual, terá:
nos seus resultados. Assim, pelo comando 'cd', apenas queremos modificar essa variável interna. Acho que se tentarmos, podemos alterar a variável PWD de qualquer pty no shell, é claro. Gostar:
Mas acho que não há necessidade em casos normais. Em outra palavra, usamos ajuda do bash (ou qualquer shell) para modificar sua variável interna definida.
fonte
..
caminho, não o caminho que começou a partir de:#include <stdlib.h>
int main(void) { chdir(".."); puts(getenv("PWD")); }
(conchas C expor o CWD como% cwd em vez disso, por sinal.)#include <unistd.h>
int main(void) { char ac[99]; setenv("PWD", "/", 1); puts(getcwd(ac, sizeof(ac))); }
Ele mostrará o diretório do qual você iniciou o programa, não/
.$PWD
só tem significado para a concha Bourne. É apenas uma maneira de o shell comunicar algo que sabe sobre shell scripts, para que eles não precisem ligarpwd
para encontrá-lo. Qualquer programa independente, dependendo do valor de$PWD
, não será confiável.