onde está localizado o 'cd'? [duplicado]

33

Em um sub shell do bash, recebo o seguinte erro ao executar o cd

sudo: cd: command not found

Isso é esperado porque não tenho um caminho. Normalmente, para contornar isso eu apenas forneço o caminho completo da seguinte forma: (/ usr / local / bin / foo)

Para minha surpresa, cd não parece estar em nenhum dos lugares normais.

which cd
whereis cd
ls /bin | grep cd

Por comparação, ls está exatamente onde eu esperaria.

which ls
/bin/ls

Onde o comando cd está localizado? E por que é diferente de todos os outros comandos?

Atualizar

Outro detalhe interessante, o cd não aparece em hash

hash
0   /bin/ls
2   /usr/bin/find
2   /sbin/ip
1   /usr/bin/updatedb
1   /usr/bin/apt-get
    
por spuder 26.02.2014 / 01:45

6 respostas

44

Qual cd eu estou usando?

Se você estiver no Bash%, ocd será incorporado. O comando type confirma isso:

$ type -a cd
cd is a shell builtin
cd is /usr/bin/cd
cd is /bin/cd

O sistema usará a primeira coisa nesta lista, então o builtin será a opção preferida, e a única que funciona (veja a seção abaixo em O que é / bin / cd ).

O que é um builtin?

Eu gosto de pensar em builtins como funções que o Bash sabe fazer sozinho. Basicamente tudo o que você usa muito foi movido para o "kernel" do Bash, para que ele não precise executar um processo para cada vez.

Você sempre pode dizer explicitamente ao Bash que você quer um embutido usando o comando builtin da seguinte forma:

$ builtin cd

Veja a ajuda sobre builtin :

$ help builtin

Por que o cd não está no hash?

O hash destina-se apenas ao "hash" (também conhecido como "salvar" em um par de chave / valor) os locais dos arquivos, não para os códigos internos ou palavras-chave. A tarefa principal para hash é economizar ao ter que percorrer o $PATH a cada vez que procura executáveis usados com frequência.

Palavras-chave?

Estes são normalmente os comandos que fazem parte dos recursos da linguagem de programação do Bash.

$ type while
while is a shell keyword
$ type for
for is a shell keyword
$ type !
! is a shell keyword

Algumas coisas são implementadas de várias maneiras, como [ :

$ type -a [
[ is a shell builtin
[ is /usr/bin/[
[ is /bin/[    

... e cd como você descobriu.

O que é / bin / cd?

No meu sistema Fedora 19 /bin/cd é na verdade um script de shell:

$ more /bin/cd
#!/bin/sh
builtin cd "$@"

Mas não faz o que você pensa. Veja estes outros Q & U Q & A para mais detalhes:

Linha de fundo:

O POSIX requer que ele esteja lá e, nessa implementação, ele atua como um teste, confirmando que você pode alterar os diretórios para X, mas retornando um código de retorno confirmando ou negando que isso é possível.

    
por 26.02.2014 / 03:58
16

É um builtin. Veja man bash para os detalhes de cd e o Manual de bash para uma descrição de builtins:

Builtin commands are contained within the shell itself. When the name of a builtin command is used as the first word of a simple command (see Simple Commands), the shell executes the command directly, without invoking another program. Builtin commands are necessary to implement functionality impossible or inconvenient to obtain with separate utilities.
    
por 26.02.2014 / 01:57
3

type e whereis podem mostrar que, por exemplo,

Para grep:

$ type grep
grep is /bin/grep

Para chown:

$ whereis chown
chown: /bin/chown /usr/share/man/man2/chown.2.gz /usr/share/man/man1/chown.1.gz

locate também pode ser útil para mostrar arquivos relacionados com base em uma pesquisa com curinga, por exemplo, para o comando chown:

$ locate chown
/bin/chown
/home/durrantm/.rvm/gems/ruby-1.9.3-p194/doc/rubyzip-0.9.8/ri/Zip/ZipFileSystem/ZipFsFile/chown-i.ri
/usr/lib/pt_chown
/usr/share/man/man2/fchown32.2.gz
/usr/share/man/man2/fchownat.2.gz
/usr/share/man/man2/lchown.2.gz
/usr/share/man/man2/lchown32.2.gz
/usr/share/zsh/functions/Completion/Unix/_chown

Finalmente, quando o resultado é que o comando é 'construído', como você viu para cd , significa que o código para ele está realmente no programa principal bash e não em um programa diferente localizado em outro lugar no disco.

    
por 26.02.2014 / 02:17
1

cd é a função interna para shells, por exemplo. bash, csh, ksh.

Existem muitos recursos internos suportados por shells, você pode verificá-los usando o comando man bash .

    
por 26.02.2014 / 02:10
1

Assim como os comandos internos e externos do DOS. Comandos simples são implementados no shell (mais comumente command.com ). Comandos mais complexos e menos usados são implementados em arquivos executáveis separados para reduzir a complexidade e o consumo de memória do interpretador de comandos, que são, portanto, comandos externos.

    
por 27.02.2014 / 02:49
0

cd é uma função interna do shell, como outros já mencionaram:

$ type cd
cd is a shell builtin

Isso ocorre porque um processo não pode alterar o diretório de trabalho de outro processo sem usar ptrace() (que gdb usa, por exemplo). Isso seria uma sobrecarga desnecessária. Além disso, seu uso é limitado por algumas distribuições como o Ubuntu.

    
por 26.02.2014 / 14:20