Windows에서 Ubuntu의 BASH (Windows 용 AKA Linux 하위 시스템) 10-PATH는 어떻게 설정합니까?


8

기념일 업데이트 덕분에, 지금 내가 Cygwin에서 사용하고, Cygwin에서에 메이븐 설정했다 (그리고 완전히 작동있어) 크게 메이븐 설치를 구성하는 다음 내 수정, 이전 윈도우 (10)에 우분투에 BASH이 PATH환경을 변수 ( ~/.bashrc)

글쎄, BUW를 사용하여 동일한 작업을 시도하고 있지만 알 수있는 한 PATH변수는 무시됩니다 (Maven bin 디렉토리를에 추가 PATH한 다음 실행 which mvn은 공백을 반환합니다). 누락 된 트릭이 있습니까, 아니면 PATHBUW에서 다르게 설정해야 합니까?

편집하다:

구체적으로 설명하겠습니다. "???"에서 무엇을해야합니까? pathTestScript.sh를 경로에 가져 오는 단계?

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!'

편집 2 :

나는 나의 실제적인 최종 목표를 매우 명확하게하고 싶다. JDK와 Apache Maven을 일반적인 장소의 시스템에 설치했습니다. Cygwin 에서이 두 가지가 완벽하게 작동했습니다. 이제 BUW가 종료되었으므로 대신 BUW를 사용하고 싶지만 PATH에 대한 변경 사항이 아무런 영향을 미치지 않는 것처럼 환경을 설정하는 방법을 알 수 없습니다.

편집 3 :

좋아, 이제 나는 거위 추적에 관심이 있습니다. 내가 할 경우 echo $PATH, 내가 얻을/mnt/c/Program\ Files/apache-maven-3.3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

그것이 내가 기대하는 것입니다. 그게 내가 내 ~/.bashrc파일에 넣은 것입니다 ... 그럼 내가 ls /mnt/c/Program\ Files/apache-maven-3.3.9/bin하고 얻을

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

그러나 내가 할 때 which mvn, 나는 비워지고, 호출하면 그것을 설치하는 mvn데 사용 apt-get하도록 리디렉션됩니다 .

따라서 문제는 PATH가 업데이트되지 않는다는 것이 아니라 그냥 무시되는 것입니다. PATH에주의를 기울일 수있는 방법이 있습니까? 그렇지 않은 경우 이것은 꽤 약한 Linux 버전입니다 (IMO)

편집 4 :

그것은 두 번 제기되었으며, 예, 함께 찍은 예제는 파일을 실행 파일로 표시하는 것을 잊었습니다. 실제 시나리오 (Maven 사용)에서 파일은 모두 실행 파일입니다.

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
C:\Users\%username%\AppData\Local\lxss\root\.bashrc경로를 추가하기 위해 지금 파일을 편집 하시겠습니까?
Peter

@Peter 그 디렉토리가 존재하지 않습니다 (로컬 아래에 'lxss'가 없습니다)
Cody S

1
주소 표시 줄에 입력하십시오. 그렇지 않으면 숨겨진 시스템 폴더를 표시하십시오. 숨겨진 폴더를 활성화하는 것만으로는 충분하지 않습니다. superuser.com/questions/1108483/…
Peter

아, 맞아 ...하지만 지금은 그것이 내 문제인지 확실하지 않습니다. 질문을 편집해야합니다
Cody S

1
왜 Bash에서 Windows Maven을 실행합니까? Windows의 Bash는 Linux 내에서 실행되며 기본 Linux 바이너리 만 실행할 수 있습니다. 네이티브 Windows 바이너리를 실행하는 데 사용되는 Cygwin과 달리 Windows exe 파일을 실행할 수 없습니다
phuclv

답변:


6

업데이트 요약

해당 실행 파일은 Linux 기본 형식 (ELF)이 아니며 Windows 용으로 컴파일됩니다. 경로 확장 중에 bash는 바이너리의 마법 번호를 확인합니다. ELF와 일치하지 않으면 경로 확장을 통해 노출되지 않습니다. 그러나 Windows 용 bash에는 bash 환경에서 기본 Windows 응용 프로그램을 시작하는 기능이 포함되어 있으므로 경로 확장 및 후속 이진 확인없이 직접 실행이 제대로 작동합니다.

해결 방법은 별명 기반 .bashrc 추가 (또는 경로 확장을 모방하여 bash 파일 평가를 우회하는 여러 가지 다른 방법) 또는 Linux 버전 설치입니다.


원래 답변

파일 권한

파일 간 시스템 권한 문제 일 수 있습니다. 당신 cd /mnt/c/Program\ Files/apache-maven-3.3.9/bin과 같이 mvn을 실행하려고하면 ./mvn어떻게됩니까?

ls -alt해당 디렉토리 의 출력은 무엇입니까 ?

파일이 실행 파일로 제대로 표시되지 않으면 경로에 '프로그램'으로 표시되지 않습니다. 파일이 'linux'형식 (ELF)이 아닌 이진 파일 인 경우 경로 실행 파일로 표시되지 않습니다.

mvn을 직접 실행해도 작동하지 않는 경우 (ls 결과를 게시하십시오) 실행 권한을 추가하십시오. chmod ug+x mvn

잘못된 버전 설치

Linux 네이티브 버전이 설치되어 있는지 확인하십시오. cygwin에서 사용한 것과 동일한 버전이 작동하지 않습니다.

sudo apt-get install elf-binutils mvn 파일에서 바이너리 호환성을 확인할 수 있습니다 . 명령 readelf -a mvn 은 'ELF 파일 아님 ...'과 같은 오류가 발생하면 답을 찾으십시오.

방금 예제를 테스트 쉘 스크립트에 실행 권한을 추가하지 않은 것으로 나타났습니다. 단순히 단계를 나열하는 것을 잊어 버린 경우가 아니라면 특정 실패에 대해 완전히 설명합니다.

요약:

  1. maven bin 디렉토리의 실행 파일이 chmod를 사용하여 실행 파일로 올바르게 설정되어 있는지 확인하십시오. 귀하의 답변에 ls -alt 출력을 게시하십시오.
  2. 리눅스 바이너리가 있는지 확인하십시오-utilty readelf를 사용하여 확인하십시오.
  3. 쉘 스크립트 테스트를 다시 실행하십시오. 그러나 이번에는 파일 실행 파일을 표시하십시오.

최신 정보

길 문제는 빨간 청어였다. Windows 환경의 Linux와 호환되지 않는 이진 형식을 실행하려고합니다.

표면적으로 두 환경 (Windows의 cygwin 및 bash)은 다소 유사한 사용자 경험을 제공하지만 구현 및 결과 이진 호환성은 매우 다릅니다.

결론-Cygwin 및 Linux 이진 형식은 호환되지 않습니다. Windows의 bash에서 Linux 네이티브 버전을 실행하려면 Linux 기본 버전을 설치해야합니다. Windows 환경의 bash 내부 소스에서 컴파일 할 수도 있습니다. 그러나 환경의 '초창기'특성으로 인해 의존성을 쫓는 것에 대해 걱정할 것입니다.

두 환경에 대한 간단한 설명 :

Cygwin은 POSIX 이외의 시스템에서는 일반적으로 사용할 수없는 시스템 호출에 대한 API를 제공하는 변환 계층으로, Windows 환경에서 Linux에서 실행되도록 작성된 많은 프로그램을 컴파일 할 수 있습니다. 그러나 여전히 'Windows'환경에서 실행 중입니다.이 바이너리는 이제 Windows의 cygwin 환경에서만 작동합니다. 이 변환 계층 및 관련 라이브러리를 사용하면 Linux API로 작성된 소스 코드를 cygwin 환경에서 컴파일하고 Windows에서 실행할 수 있습니다. 이러한 방식으로 빌드 된 바이너리는 Linux 또는 Windows에서 기본적으로 실행되지 않습니다. cygwin 환경에서만.

정식으로 제공되는 창의 bash 환경은 cygwin과 크게 다릅니다. 그것은 실제로 리눅스 인 것처럼 보이는 프로그램의 환경을 실제로 '재창조'합니다 (즉, 표준 라이브러리는 바이너리에 대한 수정없이 POSIX 시스템 호출과 함께 사용 가능합니다). 대부분의 경우 우분투 용으로 빌드 된 바이너리를 Windows 환경의 bash에 직접 복사하고 문제없이 실행할 수 있습니다.

Windows에서 bash에서 유효한 실행 파일로 인식 되려면 기본 Linux 바이너리 형식이거나 해석 할 프로그램이 표시된 스크립트 파일 (bash 스크립트의 경우 #! / bin / bash)이어야합니다. 리눅스 라이브러리와 시스템 호출에 대해 네이티브 리눅스 바이너리가 만들어 질 것입니다. Bash는 실행 권한 비트를 확인하고 이진 파일 형식이 호환되는지 ( '마법 번호'확인) 확인하여 무언가가 유효한 실행 파일인지 확인합니다. 이진 파일이고 ELF 형식이 아닌 경우 경로 확장을 통해 셸에 노출되지 않습니다.

이 문제를 명확히하기 위해 창에서 bash에서 기본 Windows 응용 프로그램을 시작하는 부분적인 기능을 추가했지만 bash 경로 확장 이진 파일 형식 검사를 해결하지 못했거나 버그였습니다.

두 번째 편집 :

귀하의 질문에 대한 설명 :

직접 시작하면 (./mvn) Bash 평가를 무시하고 그냥 실행합니다. Windows 환경의 bash는 Windows 기본 실행 파일을 시작하기에 충분히 똑똑합니다. cygwin 바이너리가 bash에서 제대로 시작될 것이라고는 생각하지 않지만 잘못되었을 수 있습니다.이 시점에서 문서가 빈약하고 현재 테스트 환경에 액세스 할 수 없습니다.

'경로'지원과 동등한 기능을 제공하는 해결 방법 :

maven 설치에 완전히 만족한다면 (다른 호환성 문제는 없으며 모든 것이 '작동합니다') 경로에 설치하는 것이 중요하다면 동등한 기능을 제공하는 간단한 해결 방법을 사용할 수 있습니다.

.bashrc 파일에서 다음 별명을 추가하십시오.

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

Windows 환경의 bash 내의 어느 곳에서나 액세스하려는 디렉토리의 다른 실행 파일에 대해서도 동등한 작업을 반복하십시오.

bash를 다시 시작하거나 파일을 소싱 한 다음 mvn모든 디렉토리에서 작동합니다 (bin 디렉토리 내에서 직접 실행하는 명령문을 기반으로하는 ./mvn이 작동 중임).


파일은 실행 가능하지만 ELF 파일이 아닙니다. Cygwin은 왜이 바이너리를 실행할 수 있지만 BUW는 실행할 수 없습니까? 그리고 디렉토리로 이동해도 여전히 ./mvn을 실행할 수 있으며 실행되며 경로에 있지만 BUW는 승인하지 않습니다. ELF 파일이되는 것과 그렇지 않은 것이 왜 PATH 동작과 관련이 있습니까?
Cody S

내가 말했듯이 Cygwin은 Windows 환경이며 Windows 앱만 실행할 수 있습니다. Bash는 Linux 환경이며 Linux 기본 앱만 실행할 수 있습니다. 그들은 별도의 환경입니다. 기본 우분투 설치에서 일부 응용 프로그램을 복사하고 bash에서 호출하면 문제없이 실행됩니다. 그러나 bash에서는 Windows 앱을 실행할 수 없습니다. 실제 배쉬에서 실행하려면 Linux 용 maven을 다시 설정해야합니다
phuclv

다른 리눅스 머신에서 maven을 복사 했는데도 "ELF 파일 아님"결과가 나옵니다. mvn을 실행하면 응답이 없습니다. Java 프로세스가 Windows 작업 관리자에 나타나며 결국 bash에서 "Killed"응답을 얻기 위해 종료해야합니다. "/ mnt / c / Program Files (x86) / Maven / bin"에서 maven을 실행하려고해도 정확히 동일한 동작을 얻습니다. 어떤 아이디어?
papadi

0

시도하십시오 echo 'PATH="~/pathTest/:$PATH"' > ~/.bash_path(원하는 이름)

source ~/.bash_path

echo $PATH 변화가 있는지 확인하기 위해

chmod +x ~/pathTest/pathTestScript.sh 직접 실행하려면 파일에 실행 권한을 추가해야합니다.

pathTestScript.sh

이것이 작동하면 라인 source ~/.bash_path을 추가하십시오 ~/.bashrc.

에 의해 호출 할 수 있습니까 /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn?


에 의해 호출 할 수 있으며 PATH에을 /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn추가 bin했지만 여전히 which mvn성공적으로 수행 할 수 없으므로 의미가 없습니다.
Cody S

기묘한. 답변을 검색하는 동안 더 나아지기 위해 Linux 별칭을 사용하여 호출을 조금 더 간단하게 만들 수 있습니다. linfo.org/alias.html
Roden Luo

0

Ubuntu를 기반으로하기 때문에 실제 PATH 파일은 " /etc/environment"입니다 (파일 형식은 표시되지 않음).

$ nano /etc/environment파일을 편집하는 가장 쉬운 방법입니다. 다음과 같은 것을 보게 될 것입니다 :

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

마지막 디렉토리 다음에 마지막 따옴표 앞에 선택한 디렉토리를 추가 :하여 이전 디렉토리와 구분할 추가 (콜론)을 추가 할 수 있습니다.

마지막으로 " /etc/environment" 파일을 실행해야합니다 . 다음을 입력하여 수행 할 수 있습니다.

$ . /etc/environment

나는 이것을 실행 $ sudo -s하고로 확인했다 $ env. env 명령이 즉시 변경 사항을 표시해야한다고 확신하고 선택한 변경 사항이 적용된 후 다시 시작하면 맨 위에 표시됩니다.


시나리오로 내 질문을 편집했지만 /etc/environment파일 에 ~ / pathTest를 추가해도 파일이 경로에 추가되지 않았습니다. 솔루션이 작동하지 않습니다.
Cody S

~를 사용하지 마십시오; 전체 경로를 사용하십시오. 올바른 디렉토리에 pwd를 입력하여 얻을 수 있습니다
djsmiley2kStaysInside

나는하지 않았다. 여전히 작동하지 않습니다. 죄송하지만, 오해의 소지가있을 수 있지만, env 경로에서 ~를 사용하지 않고 항상 확장합니다
Cody S

방금 기능을 다시 설치했는데 대답이 충분하지 않고 특정 세션의 경로 만 일시적으로 변경되는 것을 발견했습니다. 좀 더 찾고 있어요. 미안 코디
Chris Bernard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.