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 PATH
ambiente. variável (pol ~/.bashrc
)
Bem, estou tentando fazer a mesma coisa usando o BUW, mas até onde eu sei, a PATH
variável é ignorada (adicionando o diretório bin do Maven ao PATH
e, em seguida, executando which mvn
retornos em branco). Há um truque que estou faltando ou preciso configurar meu PATH
diferente 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 ~/.bashrc
arquivo ... Então eu faço ls /mnt/c/Program\ Files/apache-maven-3.3.9/bin
e 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-get
na 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
C:\Users\%username%\AppData\Local\lxss\root\.bashrc
arquivo por enquanto para adicionar o caminho?Respostas:
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/bin
e tentar executar o mvn assim, o./mvn
que acontece?Qual é a saída
ls -alt
desse 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 comandoreadelf -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:
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:
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).fonte
Tente
echo 'PATH="~/pathTest/:$PATH"' > ~/.bash_path
(qualquer nome que você quiser)source ~/.bash_path
echo $PATH
para ver se alguma coisa mudachmod +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_path
em você~/.bashrc
.Você pode invocar por
/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn
?fonte
/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn
, e eu adicionei obin
PATH, mas ainda não posso fazer comwhich mvn
sucesso, o que não faz sentido para mim.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: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:Corri estes
$ sudo -s
e 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.fonte
/etc/environment
arquivo, meu arquivo não foi adicionado ao caminho. Sua solução não funciona.