Editar e recompilar programa individual

4
whereis pwd
pwd: /bin/pwd /usr/include/pwd.h /usr/share/man/man1/pwd.1.gz

O pwd na pasta binária não é o mesmo que

type pwd
pwd is a shell builtin

Então não seria inofensivo fazer alguma experimentação no pwd externo? Como, adicionando um "Olá shell!" apenas para demonstrar o princípio?

Onde está a fonte do pwd? Você costuma obtê-lo com a distribuição (eu estou no Debian) ou você de alguma forma instala ou faz o download? Está em C? Eu compilo como qualquer outro arquivo com o gcc e coloco o resultado (com o ajuste chmod) em uma pasta englobada pelo caminho? E quanto a atualizações? Como você entende, estou perdendo a grande figura aqui.

(A propósito, o arquivo de cabeçalho parece não estar relacionado: pwd como na senha, não no diretório de trabalho print / present.)

    
por Emanuel Berg 29.04.2012 / 13:22

3 respostas

7

wouldn't it be harmless to do some experimentation on the external pwd?

É uma aposta ruim que nada use /bin/pwd . É uma boa prática em scripts shell - particularmente aqueles comumente executados pelo root - para fornecer caminhos completos para programas externos, por motivos de segurança.

Ainda assim, você pode criar com segurança um pwd personalizado e colocá-lo em seu diretório pessoal em algum lugar. Se o pacote usar o Autoconf , isso geralmente é suficiente para configurar um pacote a ser instalado em seu diretório pessoal:

$ ./configure --prefix=$HOME

Você pode dizer algo como --prefix=$HOME/pwd-test para evitar qualquer possibilidade de conflito.

Contanto que o sistema de compilação do pacote esteja configurado corretamente, quando você o configurar assim, você pode dizer com segurança make install sem ser root, porque todos os arquivos que ele escreve devem estar sob o prefixo que você deu.

Where is the source for pwd?

pwd faz parte de coreutils . Você encontra essas coisas com o mecanismo de pesquisa de pacotes Debian .

Do you usually get it with the distribution (I'm on Debian)

Você provavelmente ainda não baixou as fontes de distribuição, mas sim, é considerado parte da distribuição Debian. Eles estão separados em um conjunto de DVD de origem com seis discos (!) , compreendendo cerca de 25 GB, e é por isso que a maioria das pessoas nunca faz o download deles.

A menos que você esteja tentando fazer algo como reconstruir toda a distribuição Debian ou criar uma distribuição derivada, você provavelmente não deve baixá-los agora mesmo. Os downloads à la carte provavelmente são uma ideia melhor nesse estágio.

do you somehow install or download it?

Sim, você também pode usar apt-get para instalar o código-fonte dos pacotes. Há um capítulo inteiro em the APT HOWTO sobre isso.

(Esse documento está marcado como Obsoleto, mas não estou vendo um documento de substituição.)

Is it in C?

Com toda a probabilidade, sim.

Do I compile it like any other file with gcc and put the result (with fitting chmod) in a folder encompassed by the path?

Você provavelmente não roda o gcc diretamente, você provavelmente faz o% padrãoconfigure ; make ; make install dance. Se você baixar o tarball de origem da página de busca de pacotes Debian, você provavelmente encontrará um arquivo INSTALL ou README no tarball, que conterá instruções de compilação.

What about upgrades?

E eles? O mecanismo de pesquisa de pacotes ajudará você a encontrar qualquer versão do software que provavelmente desejará e apt-get o ajudará a rastrear alterações nas fontes, assim como nos binários.

I'm missing the big picture here.

Você pode querer dar uma olhada na Documentação Debian , então.

the header file seems to be unrelated: pwd as in password, not print/present working directory.)

Sim. É um cabeçalho de utilitário para programadores C, para obter acesso ao banco de dados do usuário. Diga man 3 getpwent para ter uma ideia do que está disponível por meio dessa interface.

    
por 29.04.2012 / 13:52
5

No Linux, pwd é normalmente fornecido pelo pacote coreutils . Você pode baixar a fonte desse site, ou do repositório de fontes de sua distribuição ( aqui para o Debian ).

Você pode compilar pwd e as outras ferramentas desse pacote da maneira usual: descompactar a origem e:

./configure
make

Você pode modificar o código-fonte para pwd e recompilar como desejar (é código C, em src/pwd.c ). Mas eu não recomendo que você instale qualquer coisa que você tenha modificado de coreutils sobre a cópia da sua distribuição.

Se você quiser "brincar" com ele, instale-o em um local em algum lugar do seu diretório pessoal e coloque-o no seu caminho (ou no caminho de um usuário de teste). Apenas sobrescreva os executáveis gerenciados pelo seu gerenciador de distribuição / pacote se você souber exatamente o que está fazendo (e saiba como desfazer isso).

Isso não é específico de coreutils , você pode fazer isso com todos os pacotes de código aberto que sua distribuição fornece (e até mesmo aqueles que não são fornecidos). Mas o aviso sobre não importar arquivos gerenciados pela sua distribuição é mais importante para pacotes de "sistema" de baixo nível, onde é mais provável que você estrague completamente o sistema.

    
por 29.04.2012 / 13:41
3

Por que /bin/pwd e um builtin

/bin/pwd é um executável independente que imprime o diretório atual. A maioria das shells tem um pwd embutido por dois motivos:

  • Esta é uma operação simples e comum; um builtin é mais rápido.
  • Várias shells rastreiam links simbólicos no diretório atual. Considere:

    $ pwd
    /home/gilles
    $ ln -s /tmp sym       # Create a symlink /home/gilles/sym -> /tmp
    $ cd sym
    $ pwd
    /home/gilles/sym       # the directory tracked by the shell
    $ /bin/pwd
    /tmp                   # the "real" location of the current directory
    $ pwd -P               # pwd -P also shows the "real" location
    /tmp
    $ cd ..
    $ pwd
    /home/gilles           # The shell stripped one level off its current directory
    $ set -P               # Turn off symlink following (in bash)
    $ cd sym
    $ pwd
    /tmp
    $ cd ..
    $ pwd
    /
    

Alguns scripts chamam explicitamente /bin/pwd para evitar qualquer link simbólico após o shell. É provável que a substituição de /bin/pwd por outra coisa divida as coisas.

Onde encontrar a fonte

No Debian e seus derivados (incluindo Ubuntu e derivativos), e qualquer outro sistema que use o dpkg e o APT para manipular pacotes, você pode encontrar em qual pacote um arquivo está rodando

dpkg -S /bin/pwd

Você verá que este arquivo é fornecido pelo pacote coreutils .

Em geral, para descobrir o pacote de origem do qual este pacote binário é construído, execute dpkg -s coreutils ou apt-cache show coreutils ou aptitude show coreutils ; aqui, eles não mostram uma linha Source: , o que significa que o pacote fonte tem o mesmo nome que o pacote binário (isso nem sempre é o caso, principalmente quando um pacote fonte é dividido em vários pacotes binários).

Se você deseja obter o código-fonte, nem precisa descobrir o nome do pacote-fonte. Apenas corra

apt-get source coreutils

Isso fará o download e descompactará as fontes do pacote coreutils .

Veja também

Warren Young e Respostas de Mat , que fazem alguns pontos complementares.

    
por 30.04.2012 / 02:38

Tags