BASH no Ubuntu no Windows (AKA Linux Subsystem para Windows) 10 - Como configuro meu PATH?


8

Graças à atualização de aniversário, agora tenho o BASH no Ubuntu no Windows 10. Anteriormente, usei o Cygwin e configurei o Maven no Cygwin (e o fiz funcionar totalmente), que consistia principalmente na instalação do Maven e na modificação do PATHambiente. variável (pol ~/.bashrc)

Bem, estou tentando fazer a mesma coisa usando o BUW, mas até onde eu sei, a PATHvariável é ignorada (adicionando o diretório bin do Maven ao PATHe, em seguida, executando which mvnretornos em branco). Há um truque que estou faltando ou preciso configurar meu PATHdiferente no BUW?

EDITAR:

Deixe-me ser específico. O que preciso fazer no "???" etapa para obter pathTestScript.sh no caminho?

mkdir -p ~/pathTest
touch ~/pathTest/pathTestScript.sh
echo '#!/bin/sh' >> ~/pathTest/pathTestScript.sh
echo 'echo "it works!"' >> ~/pathTest/pathTestScript.sh
bash ~/pathTest/pathTestScript.sh
    # Should output 'it works!'
# ?????????
pathTestScript.sh
    # Should output it works!'

EDIT 2:

Quero ser muito claro com meu objetivo final real. Eu tenho um JDK e o Apache Maven instalados no meu sistema nos locais habituais. Eu tive esses dois funcionando perfeitamente bem em Cygwin. Agora que o BUW foi lançado, eu quero usá-los lá, mas não consigo descobrir como configurar meu ambiente para eles, pois qualquer alteração feita no PATH parece não ter efeito.

EDIT 3:

Ok, agora estou preocupado que estou em um ganso selvagem. Se eu fizer echo $PATH, eu recebo/mnt/c/Program\ Files/apache-maven-3.3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

É o que eu espero. É isso que eu coloquei no meu ~/.bashrcarquivo ... Então eu faço ls /mnt/c/Program\ Files/apache-maven-3.3.9/bine recebo

m2.conf  mvn  mvn.cmd  mvnDebug  mvnDebug.cmd  mvnyjp

Mas quando o faço which mvn, fico em branco e, se invocar mvn, sou redirecionado para usar apt-getna instalação.

Portanto, a questão não é que o PATH não esteja sendo atualizado ... está apenas sendo ignorado. Existe uma maneira de fazê-lo prestar atenção no CAMINHO? Caso contrário, esta é uma versão bastante fraca do Linux (IMO)

EDIT 4:

Ele foi apresentado algumas vezes e, sim, meu exemplo tapa junto esqueceu de marcar o arquivo como executável. No meu cenário do mundo real (com o Maven), os arquivos são todos executáveis:

cd /mnt/c/Program\ Files/apache-maven-3.3.9/bin && ls -alt
total 36
dr-xr-xr-x 2 root root    0 Apr 19 11:56 ..
-r-xr-xr-x 1 root root 1843 Apr 19 11:56 mvnyjp
dr-xr-xr-x 2 root root    0 Apr 19 11:56 .
-r-xr-xr-x 1 root root 1815 Apr 19 11:56 mvnDebug
-r-xr-xr-x 1 root root 7383 Apr 19 11:56 mvn
-r-xr-xr-x 1 root root 1513 Apr 19 11:56 mvnDebug.cmd
-r-xr-xr-x 1 root root 6067 Apr 19 11:56 mvn.cmd
-r-xr-xr-x 1 root root  230 Apr 19 11:56 m2.conf

1
Talvez edite o C:\Users\%username%\AppData\Local\lxss\root\.bashrcarquivo por enquanto para adicionar o caminho?
Peter

@ Pedro Isso dir não existe (não tenho um 'lxss' abaixo Local)
Cody S

1
Digite na barra de endereço, você deve tê-lo. Caso contrário, mostre pastas ocultas do sistema. Ativar pastas ocultas não é suficiente. Veja superuser.com/questions/1108483/…
Peter

Ah, você está certo ... mas agora não tenho certeza se esse é o meu problema. Vou ter que editar a minha pergunta
Cody S

1
Por que você executa o Windows Maven no Bash? O Bash no Windows é executado no Linux e só pode executar binários nativos do Linux. Você não pode executar arquivos exe do Windows nele, ao contrário Cygwin que são usados para executar binários do Windows nativos
phuclv

Respostas:


6

Resumo da atualização

Os executáveis ​​em questão não são formato nativo linux (ELF), são compilados para o Windows. Durante a expansão do caminho, o bash verifica o número mágico do binário, se não for compatível com o ELF, ele não o expõe por meio da expansão do caminho. No entanto, o bash para Windows incluiu a capacidade de iniciar aplicativos nativos do Windows a partir do ambiente do bash, e é por isso que a execução direta (sem expansão de caminho e verificação binária subsequente) funciona bem.

A resolução é uma adição .bashrc baseada em alias (ou qualquer número de métodos alternativos para imitar a expansão do caminho, ignorando a avaliação do arquivo bash) ou a instalação da versão linux.


Resposta original

Permissões de arquivo

É possivelmente um problema de permissões do sistema de arquivos cruzados. Se você cd /mnt/c/Program\ Files/apache-maven-3.3.9/bine tentar executar o mvn assim, o ./mvnque acontece?

Qual é a saída ls -altdesse diretório?

Se o arquivo não estiver corretamente marcado como executável, ele não aparecerá como um 'programa' no seu caminho. Se for um arquivo binário e não estiver no formato 'linux' (ELF), também não será exibido como um caminho executável.

Se a execução direta do mvn não funcionar (publique os resultados do ls), tente adicionar permissões de execução chmod ug+x mvn

Versão errada instalada

Você tem certeza de que possui a versão nativa do linux instalada - a mesma versão usada com o cygwin quase definitivamente não funciona.

Você pode verificar a compatibilidade binária com sudo apt-get install elf-binutils o arquivo mvn e, em seguida, usar o comando readelf -a mvn Se você receber um erro como 'Não é um arquivo ELF ...', terá sua resposta.

Acabei de notar que você não adicionou permissões de execução ao script do shell de teste no seu exemplo, o que (a menos que você simplesmente se esqueça de listar a etapa) explica completamente essa falha específica.

Resumo:

  1. Verifique se os executáveis ​​no diretório maven bin estão definidos corretamente como executáveis ​​usando chmod. Poste a saída de ls -alt na sua resposta.
  2. Verifique se você possui um binário do linux - use o utilitário readelf para verificar.
  3. Execute seu teste de script de shell novamente, mas desta vez marque o arquivo como executável.

Atualizar

A questão do caminho era um arenque vermelho; você está apenas tentando executar um formato binário que não é compatível com o ambiente linux on windows.

Na superfície, os dois ambientes (cygwin e bash no windows) fornecem uma experiência de usuário um pouco semelhante, mas a implementação e a compatibilidade binária resultante são muito diferentes.

Conclusão - os formatos binários Cygwin e Linux não são compatíveis. Você precisa instalar a versão nativa do linux para executá-la do bash no windows. Você também pode compilá-lo da fonte dentro do ambiente do bash no Windows; mas devido à natureza do ambiente dos "primeiros dias", eu me preocupava em procurar dependências.

Breve descrição dos dois ambientes:

O Cygwin é efetivamente uma camada de tradução que fornece uma API para chamadas de sistema que normalmente não estão disponíveis em sistemas não POSIX, o que permite compilar muitos programas escritos para rodar em Linux no ambiente Windows. No entanto, ele ainda está sendo executado em um ambiente de 'janelas' - que o binário agora funcionará apenas no ambiente de cygwin no Windows. Essa camada de conversão e as bibliotecas associadas permitem que o código-fonte escrito na API do Linux seja compilado no ambiente cygwin e executado no Windows. Os binários criados dessa maneira não serão executados no Linux ou Windows nativamente; somente no ambiente cygwin.

O ambiente do bash nas janelas fornecido pelo canonical é muito diferente do cygwin. Realmente "recria" um ambiente para um programa que parece realmente ser Linux - ou seja, as bibliotecas padrão estão disponíveis junto com as chamadas do sistema POSIX - sem exigir nenhuma modificação nos binários. Em muitos casos, um binário construído contra o ubuntu pode ser copiado diretamente para o ambiente do bash no Windows e executado sem problemas.

Para ser reconhecido como um executável válido no bash no Windows, ele precisa estar em um formato binário nativo do linux ou em um arquivo de script marcado com o programa para interpretá-lo (para um script do bash, #! / Bin / bash). Um binário nativo do Linux será construído com base nas bibliotecas do Linux e nas chamadas do sistema. O Bash confirma que algo é um executável válido, verificando os bits de permissão executável e se o formato do arquivo binário é compatível (uma verificação de 'número mágico'). Se for um arquivo binário e não estiver no formato ELF, não será exposto ao shell por meio da expansão do caminho.

Para tornar esse problema mais difícil de esclarecer, eles adicionaram capacidade parcial para iniciar aplicativos nativos do Windows do bash no Windows, mas claramente não abordaram a verificação do formato de arquivo binário de expansão do caminho do bash - ou o fizeram e é um bug.

Segunda edição:

Esclarecimento sobre sua pergunta:

Quando você o inicia diretamente (./mvn), ignora a avaliação do Bash e apenas a executa. O ambiente do bash no Windows é inteligente o suficiente para iniciar os executáveis ​​nativos do Windows, que devem ser. Não acredito que um binário cygwin seja iniciado corretamente a partir do bash, mas posso estar incorreto - a documentação é escassa neste momento e não tenho um ambiente de teste acessível no momento.

Solução alternativa que fornece capacidade equivalente ao suporte de 'caminho':

Caso contrário, você está totalmente satisfeito com a instalação do maven (nenhum outro problema de compatibilidade, tudo simplesmente 'funciona'), mas tê-lo no caminho é importante, você pode usar uma solução alternativa simples que fornecerá capacidade equivalente.

No seu arquivo .bashrc, adicione o seguinte alias:

alias mvn='/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn'

Repita o equivalente para quaisquer outros executáveis ​​nesse diretório que você deseja acessar de qualquer lugar dentro do ambiente do bash on windows.

reinicie o bash ou origine o arquivo e, em seguida mvn, funcionará em qualquer diretório (com base na sua declaração de que a execução direta de dentro do diretório bin, ./mvn, estava funcionando).


O arquivo é executável, mas não é um arquivo ELF ... mas que diabos? Por que o Cygwin pode executar esse binário, mas o BUW não pode? E se eu navegar para o diretório, ainda posso executar ./mvn, e ele é executado, e está no meu caminho, mas o BUW se recusa a reconhecê-lo. Por que ser / não ser um arquivo ELF tem algo a ver com o comportamento PATH?
Cody S

como eu disse, Cygwin é um ambiente Windows e só pode executar aplicativos Windows. O Bash é um ambiente Linux e pode executar apenas aplicativos nativos do Linux. Eles são ambientes separados. Apenas copie algum aplicativo de uma instalação nativa do Ubuntu e tente chamá-lo no bash, ele será executado sem problemas. Mas você não pode executar o aplicativo do Windows no bash. Se você deseja executar em bash real, você precisa configurar o maven para Linux novamente
phuclv

Também recebo o resultado "Não é um arquivo ELF", mesmo que eu tenha copiado o maven de outra máquina Linux. Quando executo o mvn, não recebo resposta. Um processo java aparece no gerenciador de tarefas do Windows, que eu preciso matar para obter uma resposta "Killed" no bash. Também recebo exatamente o mesmo comportamento se tentar executar o maven em "/ mnt / c / Arquivos de Programas (x86) / Maven / bin". Alguma ideia?
papadi 22/09/16

0

Tente echo 'PATH="~/pathTest/:$PATH"' > ~/.bash_path(qualquer nome que você quiser)

source ~/.bash_path

echo $PATH para ver se alguma coisa muda

chmod +x ~/pathTest/pathTestScript.sh Para executá-lo diretamente, você precisa adicionar o direito de execução ao arquivo.

pathTestScript.sh

Se isso funcionar, basta adicionar a linha source ~/.bash_pathem você ~/.bashrc.

Você pode invocar por /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn?


Eu posso chamar por /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn, e eu adicionei o binPATH, mas ainda não posso fazer com which mvnsucesso, o que não faz sentido para mim.
Cody S

Esquisito. Para melhorar enquanto você procura respostas, tente o alias do Linux para tornar a chamada um pouco mais simples. linfo.org/alias.html
Roden Luo

0

Como ele é baseado no Ubuntu, o arquivo PATH real é " /etc/environment" (não mostra o tipo de arquivo).

$ nano /etc/environmenté a maneira mais fácil de editar o arquivo. Você verá algo assim:

PATH = "/ usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / jogos: / usr / local / jogos"

Você pode adicionar o diretório escolhido antes das aspas finais, após o último diretório, com um :(dois-pontos) adicional para delimitar o diretório anterior.

Por fim, você deve executar o arquivo " /etc/environment"; isso pode ser feito digitando:

$ . /etc/environment

Corri estes $ sudo -se verifiquei com $ env. Estou um pouco confiante de que o comando env deve mostrar as alterações imediatas e uma reinicialização deve terminar após as alterações selecionadas.


Editei minha pergunta com um cenário, mas quando adicionei ~ / pathTest ao /etc/environmentarquivo, meu arquivo não foi adicionado ao caminho. Sua solução não funciona.
Cody S

não use ~; use o caminho completo. Obtê-lo via pwd digitação no diretório certo
djsmiley2kStaysInside

Eu não fiz. Ainda não funciona. Desculpe, eu posso ver como isso pode ser enganosa, mas não, eu não usar ~ em meus caminhos env, eu sempre expandi-los
Cody S

Acabei de reinstalar o recurso e estou achando que minha resposta não é suficiente e apenas altera temporariamente o caminho para uma sessão específica. Estou pesquisando um pouco mais. Desculpe, Cody.
22716 Chris Bernard
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.