Qual é o objetivo do comando externo `cd`?

72

Conforme mencionado nesta resposta , os sistemas POSIX possuem um binário externo cdalém do shell embutido. No OS X 10.8 é /usr/bin/cd. Você não pode usá-lo como o embutido, cdpois ele sai imediatamente após alterar seu próprio diretório de trabalho. Que finalidade serve?

kojiro
fonte
Observe que o Ubuntu e o CentOS (e, portanto, presumivelmente o Red Hat) não têm /usr/bin/cd, apenas o shell embutido.
Keith Thompson
11
Meu Fedora 19 inclui /bin/cdno entanto.
slm
11
O Debian (eu verifiquei vários lançamentos, incluindo testes atuais) não tem /bin/cdnem /usr/bin/cd.
derobert 26/02
11
Eu acho que isso torna esses sistemas não estritamente POSIX. Assim como todo mundo. :)
kojiro

Respostas:

65

Ele serve principalmente para garantir que o baú de ferramentas POSIX esteja disponível dentro e fora de um shell (consulte a lógica do POSIX para solicitá-los ).

Por cdisso, isso não é tremendamente útil, mas observe que cdaltera os diretórios, mas tem outros efeitos colaterais: ele retorna um status de saída que ajuda a determinar se você pode chdir()ou não acessar esse diretório e exibe uma mensagem de erro útil explicando por que você não pode chdir()quando você não pode.

Exemplo:

dirs_i_am_able_to_cd_into=$(find . -type d -exec cd {} \; -print)

Outro efeito colateral potencial é a montagem automática de um diretório.

Em alguns sistemas, a maioria dos comandos externos para os recursos internos do shell padrão é implementada como um link simbólico para o mesmo script que:

#! /bin/sh -
"${0##*/}" "$@"

Isso é iniciar um shell e executar o built-in nele.

Alguns outros sistemas (como o GNU), têm utilitários como verdadeiros comandos executáveis, o que pode levar a confusões quando o comportamento difere da versão interna do shell.

Stéphane Chazelas
fonte
3
+1 para a observação sobre efeitos colaterais e mensagens de erro. Nem sempre é bem explicado aos novos usuários que muitos idiomas inteligentes no Unix vêm do uso cuidadoso de efeitos colaterais. E as próprias páginas de manual nunca foram boas em descrever o quadro geral.
RBerteig
Veio aqui de uma pergunta semelhante no SO, você poderia elaborar o que quer dizer quando diz "montagem automática de um diretório"?
ffledgling
11
@ffledgling, consulte en.wikipedia.org/wiki/Automounter
Stéphane Chazelas
11
Para descompactar um pouco o pensamento de Stéphane Chazelas: se você precisa garantir que um diretório auto-passável seja montado de fato, sem fazer nenhuma alteração e sem tentar ler nenhum arquivo, você pode usar o cdcomando externo . Pode ser útil para monitorar a disponibilidade de um sistema de arquivos remoto montável automaticamente, ou talvez antes de fazer algo crítico com o tempo.
telcoM 5/0618
11

O fato de um comando cd não embutido está disponível é essencialmente devido ao POSIX exigência para todos os builtins regulares para ser resgatados pelos comandos da família exec env, find, nice, nohup, timee xargscombinado ao fato de alguns desses comandos não estão sendo si implementado como builtins.

Isso não faz muito sentido, cdpois combiná-lo com esses comandos é inútil. Aqui estão alguns exemplos mais ou menos sustentáveis:

find . -type d -exec cd {} \;
env HOME=/foo cd
jlliagre
fonte
2
Vários internos estão realmente isentos dessa regra . Estranhamente, o cd não é um deles.
Kevin
5
@ Kevin eu escrevi que é um requisito para todos os componentes regulares , os isentos são componentes especiais : break, :, continue, . , eval, exec, exit, export, readonly, return, set, shift, times, trap, unsetseriam irrelevantes como comandos externos, enquanto cdé um componente regular que possui alguns casos de uso documentados como comando.
jlliagre
1

Além de verificar se um caminho corresponde a um diretório acessível, o cdexecutável processará e usará a CDPATHvariável e imprimirá o caminho absoluto do diretório resolvido se tiver sido usado com êxito.

$ export CDPATH=/usr
$ echo bin lib | xargs -n 1 cd
/usr/bin
/usr/lib

Isso é útil apenas ocasionalmente, mas economizaria a reimplementação da mesma lógica para procurar diretórios correspondentes. Um caso de uso concreto é encontrar o primeiro diretório existente de um nome específico sob vários pais possíveis.

cdtambém processa OLDPWDpara cd -, mas que é menos concretamente útil uma vez que a variável de ambiente já estaria disponível.

Michael Homer
fonte