Como posso alterar minha pasta pessoal do Cygwin após a instalação?

121

Acabei de instalar o Cygwin, e parece que o diretório inicial no prompt do bash está na minha unidade Z :. Não é onde eu quero.

Como posso mudar isso?

Nathan Long
fonte
1
Para aqueles que usam o Cygwin 1.7.34 ou superior, use os métodos explicados nas outras postagens, mas não se esqueça de remover o # antes db_home:para citá-lo e fazê-lo funcionar.
Maieul 7/02/19

Respostas:

180

A partir do Cygwin 1.7.34 , a maneira recomendada de fazer isso é adicionar uma db_homeconfiguração personalizada /etc/nsswitch.conf. Um desejo comum ao fazer isso é tornar o diretório inicial do Cygwin igual ao diretório de perfil de usuário do Windows. Essa configuração fará o seguinte:

db_home: windows

Ou equivalente:

db_home: /%H

Você precisa usar o último formulário se desejar alguma variação desse esquema, como segregar os arquivos iniciais do Cygwin em um subdiretório do diretório de perfil de usuário do Windows:

db_home: /%H/cygwin

Existem vários outros esquemas alternativos para a windowsopção, além de vários outros %tokens que você pode usar em vez %Hou além dela. Veja a nsswitch.confdescrição da sintaxe no Cygwin User Guide. para obter detalhes.

Se você instalou o Cygwin anterior à 1.7.34 ou executou seu mkpasswdutilitário para ter um /etc/passwdarquivo, você pode alterar o diretório inicial do Cygwin editando a entrada do usuário nesse arquivo. Seu diretório pessoal é o penúltimo elemento na linha do usuário em/etc/passwd

Seja como for, isso faz com que o HOME variável de ambiente seja definida durante a inicialização do shell.²

Consulte este item da FAQ para obter mais informações sobre o tópico.


Notas de rodapé:

  1. Considere mudar /etc/passwde /etc/groupsair do caminho para usar o novo mecanismo baseado em SAM / AD .

  2. Embora seja possível simplesmente definir %HOME%através do Painel de Controle, é oficialmente desencorajado . Ele não apenas substitui sem cerimônia os mecanismos acima, como nem sempre funciona, como ao executar scripts de shell via cron.

Warren Young
fonte
3
Observe que se você instalou o shell do Git bash em git-scm.com/download/win , você pode ter problemas com a instalação do cygwin (dependendo das opções escolhidas). Meu cygwin ~ terminou no meu diretório de usuário Win7 e sshnão funcionaria corretamente até a edição, /etc/passwdconforme descrito.
Allan
Os problemas que o @Allan menciona aqui nas instalações git são resolvidos configurando a variável de ambiente do Windows para HOME e, em seguida, recriando o /etc/passwdarquivo. Veja minha resposta aqui para evitar esses problemas.
Christopher
11
db_home: /%Hpode resolver um nome de usuário de domínio (em vez do nome de usuário local), que pode não ser o que você gostaria de ter. db_home: /cygdrive/c/Users/%Ufiz o que eu queria ter.
Abdull
2
Vejo uma diferença de desempenho entre os vários métodos. Quando uso db_home: windows, leva shcerca de 2,5 a 3,5 segundos para iniciar. Quando uso db_home: /cygdrive/c/Users/%U, leva de sh0,9 a 1,0 segundos para iniciar. Quando eu excluo a db_homelinha ou a codifico no diretório inicial do Windows, shleva cerca de 0,2 a 0,3 segundos para iniciar. Eu vou com a solução codificada, por exemplo db_home: /cygdrive/c/Users/susam, porque geralmente executo scripts de shell no Prompt de Comando usando o shcomando, por exemplo, sh foo.she torna-se inconveniente aguardar mais de 2 segundos.
27660 Susie Pal 1/16
1
Obrigado @abdull, db_home: / cygdrive / c / Usuários /% U é a resposta que eu precisava. db_home: o Windows usa "/ home /% U", que não existe na minha configuração.
Jeff Jeff
74

Cygwin 1.7.34+

Para aqueles que usam o Cygwin 1.7.34 ou superior, o Cygwin suporta a configuração de como obter informações de diretório inicial, shell de login e gecos no /etc/nsswitch.conf. Isso está detalhado na seção Guia do usuário do Cygwin:

Se você já criou um arquivo /etc/passwdou, /etc/groupdeverá removê-los e configurar o Cygwin usando o novo modelo de Segurança do Windows para mapeamentos POSIX.

[[ -f /etc/passwd ]] && mv /etc/passwd /etc/passwd.bak
[[ -f /etc/group ]] && mv /etc/group /etc/group.bak

A configuração /etc/nsswitch.confdo arquivo db_home:define como o Cygwin busca o diretório inicial do usuário. A configuração padrão para db_home:é

db_home: /home/%U

Portanto, por padrão, Cygwin apenas define o diretório home como /home/$USERNAME. Você pode alterar isso para apontar para qualquer outro caminho personalizado que desejar. Os caracteres curinga suportados são:

  • %u O nome de usuário do Cygwin (que é minúsculo).
  • %U O nome de usuário do Windows (que é U maiúsculo).
  • %D Domínio do Windows no estilo NetBIOS.
  • %HDiretório inicial do Windows no estilo POSIX. Observe que, para a db_home:configuração, isso só faz sentido logo após a barra anterior, como emdb_home: /%H/cygwin
  • %_Como espaço e caracteres TAB são usados ​​para separar os esquemas, um espaço no nome do arquivo deve ser fornecido como %_(isso é um sublinhado).
  • %% Um personagem por cento.

No lugar de um caminho, você pode especificar um dos quatro esquemas de caminho nomeados predefinidos.

  1. windowsO diretório inicial do usuário é definido como o mesmo diretório usado no diretório inicial do Windows, geralmente algo como %USERPROFILE%ou C:\Users\$USERNAME. Obviamente, o diretório do Windows é convertido no estilo POSIX pelo Cygwin.

  2. cygwinSomente AD: o diretório inicial do usuário é definido como o caminho POSIX fornecido no atributo cygwinHome da classe auxiliar cygwinUser. Veja também a seção chamada “O esquema cygwin” .

  3. unixSomente AD: o diretório inicial do usuário é definido como o caminho POSIX fornecido no atributo unixHomeDirectory da classe auxiliar posixAccount. Veja também a seção chamada “O esquema unix” .

  4. descO diretório inicial do usuário é definido como o caminho POSIX fornecido na configuração home = "..." XML-similar no atributo de descrição do usuário no SAM ou AD. Veja a seção “O esquema desc” para uma descrição detalhada.

A seguir, o diretório inicial do usuário no Cygwin tornará o mesmo usado no diretório inicial do Windows.

db_home: windows

Cygwin 1.7.33 ou anterior

Para aqueles que usam o Cygwin 1.7.33 ou anterior, atualize para a versão mais recente do Cygwin e remova os arquivos /etc/passwde os /etc/grouparquivos usados ​​anteriormente, e siga as etapas acima.

Caso contrário, siga estas etapas anteriores abaixo.

Primeiramente, defina uma variável de ambiente do Windows para HOME que aponte para o seu perfil de usuário:

  1. Sistema aberto no painel de controle
  2. Na guia Avançado, clique em Variáveis ​​de ambiente (na parte inferior)
  3. Na área Variáveis ​​do usuário, clique em "Novo ..."
  4. Para Nome da variável, insira HOME
  5. Para Valor variável, insira %USERPROFILE%
  6. Clique em OK em todas as caixas de diálogo abertas para aplicar esta nova configuração

Agora vamos atualizar o /etc/passwdarquivo Cygwin com a %HOME%variável do Windows que acabamos de criar. Os logons do shell e os logins remotos via sshcontarão /etc/passwdcom a localização do $HOMEcaminho do usuário .

No prompt de comando do Cygwin bash, digite o seguinte:

cp /etc/passwd /etc/passwd.bak
mkpasswd -l -p $(cygpath -H)  > /etc/passwd 
mkpasswd -d -p $(cygpath -H)  >> /etc/passwd 

O -dcomutador diz ao mkpasswd para incluir usuários DOMAIN, enquanto -ldeve apenas gerar usuários de máquinas LOCAL. Isso é importante se você estiver usando um PC no local de trabalho, onde as informações do usuário são obtidas de um Controlador de Domínio do Windows.

Agora, você também pode fazer o mesmo para grupos, embora isso não seja necessário, a menos que você esteja usando um computador que faz parte de um domínio do Windows. O Cygwin lê as informações do grupo nos bancos de dados da conta do Windows, mas você pode adicionar um /etc/grouparquivo se a sua máquina estiver frequentemente desconectada do seu Controlador de Domínio.

No prompt do Cygwin bash, digite o seguinte:

cp /etc/group /etc/group.bak
mkgroup -l > /etc/group 
mkgroup -d >> /etc/group 

Agora, saia do Cygwin e inicie novamente. Você deve achar que o caminho HOME aponta para o mesmo local que o seu Perfil de Usuário do Windows - ou seja,/cygdrive/c/Users/username

Christopher
fonte
7
-d é muito lento. Se você só precisa o usuário atual do que você pode usar -c vez: sinewalker.wordpress.com/2006/10/27/cygwin-users-and-groups
Ben Challenor
Ben está correto, basta adicionar uma entrada para o usuário atual especificando -c. Se você fizer isso, o Cygwin exibirá ????? para o Usuário e Grupo ao listar arquivos em sistemas de arquivos compartilhados, pois não haverá registros para outros usuários e grupos no seu Domínio ou computador local.
Christopher
1
Posso sugerir uma pequena alteração na redação: em vez de 'Agora, atualize seu arquivo Cygwin / etc / passwd com um novo caminho $ HOME', eu sugeriria 'Agora vamos atualizar o arquivo Cygwin / etc / passwd com o Variável HOME que acabamos de criar. Muito obrigado
Robert
With -d Demora alguns minutos (eu matei após 5) minutos para concluir. Então, eu executei novamente com -c. Tudo de bom para as minhas necessidades.
bartosz.r
1
@ Samuel Adicionei uma explicação para esclarecer o objetivo mkgroupacima.
Christopher
30

Eu fiz algo bastante simples. Eu não queria alterar a variável de ambiente do Windows 7. Então eu editei diretamente o arquivo Cygwin.bat.

@echo off
SETLOCAL
set HOME=C:\path\to\home
C:
chdir C:\apps\cygwin\bin
bash --login -i
ENDLOCAL

Isso apenas inicia o shell local com este diretório inicial; era isso que eu queria. Não vou acessar remotamente isso, então funcionou para mim.

Ajay
fonte
Segundo, como não posso alterar minha variável de ambiente doméstico na minha máquina de desenvolvimento.
Deqing
@WernerCD Gostaria apenas de advertir que isso pode ter consequências indesejadas ao interagir com aplicativos nativos do Windows. Seus aplicativos do Windows continuarão procurando HOME no local antigo. Um exemplo seria o Gvim, que manterá uma configuração separada do vim no %HOME%local antigo do Windows , enquanto o Cygwin vim usa o novo $HOMEcaminho que você declarou.
Christopher
Isso é ótimo ... 5 anos depois e eu gosto disso porque a "engenharia" é simples o suficiente para que um newb relativo do Cygwin (como eu) use e entenda. Aliás, colocar um atalho no seu arquivo .bat em C: \ Usuários \ <nome do usuário> \ AppData \ Roaming \ Microsoft \ Windows \ SendTo significa que você pode ir em Enviar -> Cygwin no menu sensível ao contexto (clique com o botão direito do mouse) em Explorer (e abra um terminal em qualquer lugar, com ~ / definido onde quiser).
mike roedor
19

O Cygwin mountagora suporta o método de ligação , que permite montar um diretório. Portanto, você pode simplesmente adicionar a seguinte linha em /etc/fstabe depois reiniciar seu shell:

c:/Users /home none bind 0 0
Jihem
fonte
Hoje é a maneira correta. As outras respostas são obsoletas.
ceving
@ceving Isso está documentado em algum lugar?
Asad Saeeduddin
10

Mude sua variável de ambiente HOME.

no XP, clique com o botão direito do mouse em Meu computador >> Propriedades >> Avançado >> Variáveis ​​de ambiente >> Variáveis ​​de usuário para >> [selecione a variável HOME] >> editar

Michael Paulukonis
fonte
1
Isso mudará sua variável de ambiente HOME para todos os seus aplicativos Windows também.
mob
Muito verdadeiro. Mas quais aplicativos do Windows você usa que usam a variável HOME? Eu tenho EmacsW32 e .... Cygwin. Desde que instalei o Emacs primeiro, também é onde fica a minha casa cygwin.
Michael Paulukonis 29/09/09
1
Isso não entrará em conflito com o / etc / passwd? O padrão será HOME do / etc / passwd se a variável de ambiente não estiver definida? Se não houver conflito e o padrão será o / etc / passwd, parece a configuração perfeita: estou executando o Cygwin em um pendrive, para evitar ter que pedir permissão para instalar no trabalho e, portanto, tenho um Unix- como um ambiente no meu bolso que eu possa usar quando apenas uma caixa do Windows estiver disponível. No trabalho, terei o diretório inicial do meu computador de trabalho e em outro lugar posso ter um diretório inicial no pendrive.
Iconoclast
6

Gostaria de adicionar uma correção / atualização ao valor de $ HOME com precedência. O diretório inicial em / etc / passwd tem precedência sobre tudo.

Sou usuário do Cygwin há muito tempo e fiz uma instalação limpa do Windows 7 x64 e Cygwin V1.126. Eu estava enlouquecendo tentando descobrir por que, toda vez que rodava o ssh, eu ficava recebendo:

e:\>ssh foo.bar.com
Could not create directory '/home/dhaynes/.ssh'.
The authenticity of host 'foo.bar.com (10.66.19.19)' can't be established.
...

Eu adiciono a definição HOME = c: \ users \ dhaynes no ambiente Windows, mas ainda assim ela continuou tentando criar '/ home / dhaynes'. Tentei todas as combinações possíveis, incluindo a configuração de HOME como / cygdrive / c / users / dhaynes. Pesquisou a mensagem de erro no Google, não encontrou nada, não encontrou nada no site cygwin. Eu uso o cygwin do cmd.exe, não o bash.exe, mas o problema estava presente em ambos.

Finalmente percebi que o diretório inicial em / etc / passwd estava tendo precedência sobre a variável de ambiente $ HOME. Eu simplesmente re-executei 'mkpasswd -l> / etc / passwd' e atualizei o diretório home, agora tudo está bem com o ssh.

Isso pode ser óbvio para os tipos de linux com experiência com o sysadmin, mas para aqueles que usam o Windows principalmente, é um pouco obscuro.

Dan Haynes
fonte
1
O diretório inicial em / etc / passwd NÃO tem precedência sobre tudo. No entanto, é usado como a principal fonte do caminho do diretório HOME ao efetuar login remotamente ou usando o ssh. Veja isso nas Perguntas frequentes do Cygwin cygwin.com/faq/faq.setup.html#faq.setup.home
Christopher
2

Por acaso, uso o cwRsync (Cygwin + Rsync para Windows) onde o cygwin é fornecido, e não consegui encontrar o arquivo / etc / passwd.

E continuou dizendo

Could not create directory '/home/username/.ssh'.
...
Failed to add the host to the list of known hosts (/home/username/.ssh/known_hosts).

Então, eu escrevi um arquivo em lotes que mudou a variável HOME antes de executar o rsync. Algo como:

set HOME=.
rsync /path1 user@host:/path2

E viola! A pasta .ssh apareceu no diretório de trabalho atual e o rsync parou de ser irritante com as impressões digitais rsa.

É um hotfix rápido, mas mais tarde você deve alterar HOME para um local mais seguro.

TEHEK
fonte