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 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:
- 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.
- Verifique se você possui um binário do linux - use o utilitário readelf para verificar.
- 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).
C:\Users\%username%\AppData\Local\lxss\root\.bashrc
arquivo por enquanto para adicionar o caminho?