WSL2의 cd 명령이 Windows 경로를 허용하도록 하려면 어떻게 해야 하나요?

WSL2의 cd 명령이 Windows 경로를 허용하도록 하려면 어떻게 해야 하나요?

저는 cygwin에서 온 WSL 개종자입니다. Cygwin이 하는 일 중 하나는 유닉스를 받아들이는 것입니다.그리고명령의 Windows 파일 경로 cd. 물론 대부분의 Windows 경로에는 \Unix의 특수 문자인 가 포함되어 있지만 이를 이스케이프하는 한 cdWindows 경로에 대한 ing은 예상대로 작동합니다 cd 'C:\Program Files'.너의 것을 바꿔라디렉토리는 /cygdrive/c/Program Files1 입니다 .

WSL의 경우는 그렇지 않습니다. cd 'C:\Program Files'오류 메시지를 인쇄합니다: cd: no such file or directory: C:\Program Files.

나는 cygwin의 기능을 좋아합니다.cdWSL에서 사용할 때 동일한 동작을 얻을 수 있는 방법이 있나요?

sudo apt install <x>해결책은 제3자 도구(예: ) 설치, 별칭 생성, 내 셸에서 무언가 활성화 bind또는 내 자신의 셸 스크립트 작성 등 의 형태일 수 있습니다 . bindkey내가 유닉스를 사용할 수 있게 해주는 한그리고Windows 경로를 cd인수로 사용하면 기쁠 것입니다.


추가 정보

내 배포판은 우분투입니다. 저는 zsh를 메인 쉘로 사용하지만 쉘 스크립트는 bash로 작성합니다. 이상적으로 이 솔루션은 두 가지 모두에 적합하지만, 이것이 가능하지 않다면 zsh 솔루션을 사용하고 싶습니다.

내 질문에 답하려는 사람들에게 도움이 될 수 있는 다음 관련 질문을 찾았습니다.Cygwin: CD에서 Windows 경로로 쉽게 이동

WSL을 사용하지 않지만 도움을 주고 싶은 분들은 WSL에 wslpath.이것은 공식 문서에서 찾은 가장 가까운 것입니다., 이는 사용법의 출력입니다.

➜  ~ wslpath
wslpath: Invalid argument
Usage:
    -a    force result to absolute path format
    -u    translate from a Windows path to a WSL path (default)
    -w    translate from a WSL path to a Windows path
    -m    translate from a WSL path to a Windows path, with '/' instead of '\'

EX: wslpath 'c:\users'

WSL 명령줄에서 Windows의 디렉터리/파일을 열기 위해 작성한 다른 스크립트에서 이 명령을 사용했습니다.

➜  ~ cat ~/bin/open
#! /bin/bash
set -x

arg="$*"
explorer.exe "$(wslpath -w "$arg")" # take a unix path and open it in Windows

1 : cygwin의 경로는 /cygdrive/c/WSL의 경로와 동의어입니다 /mnt/c.

답변1

Cygwin은 Windows 라이브러리 인터페이스 위에 Unix/Linux 라이브러리 인터페이스를 에뮬레이트합니다. Unix를 Windows와 공존시키려면 많은 노력이 필요합니다. 특히 파일 이름을 처리하는 기본 라이브러리 함수에서 경로를 Windows 경로로 변환하는 것은 더욱 그렇습니다. 이 코드는 Cygwin에만 적용되며 대부분의 Unix 계열 프로그램이 Windows 환경에서 실행될 수 있도록 설계되었습니다. 따라서 코드가 이와 같은 경로를 발견하면 이를 변환하지 않고 대신 c:\somefile현재 디렉터리에서 호출된 파일을 열려고 시도합니다.c:\somefile

WSL은 하드웨어에서 직접 실행되지 않고 Windows 시스템 내에서 실행되는 완전한 Linux 환경을 제공하도록 설계되었습니다. Linux 프로그램을 실행하려면 다음을 포함하여 많은 노력이 필요합니다.파일 이름에 콜론 지원. 따라서 코드는 이와 같은 경로를 볼 때 이를 현재 디렉터리의 경로 c:\somefile로 처리하는지 확인합니다 .c:\somefile

따라서 WSL 프로그램은 일반적으로 Windows 경로를 지원할 수 없습니다.UNC 경로에 액세스할 수 있지만 설치가 필요함.

그러나 특수한 경우(예: 콜론이나 백슬래시가 포함된 특정 파일 이름)를 지원하지 않는다는 점이 마음에 들지 않는 경우 특정 명령에 대한 번역 코드를 추가할 수 있습니다.

cd명령(쉘 내장)을 사용자 정의하려면 쉘 내장을 호출하기 전에 원하는 작업을 수행하는 함수를 직접 작성하세요. 다음은 .zshrc단일 인수로 호출할 때 Windows 경로를 인식하는 테스트되지 않은 코드입니다 .cd

function cd {
  emulate -L zsh
  if [[ $# -eq 1 && ( $1 == [A-Za-z]:\\* || $1 == \\\\*\\* ) ]]; then
    set -- "$(wslpath "$1")"
  fi
  builtin cd "$@"
}

경로에 공백이나 기타 특수 문자가 포함되어 있으면 따옴표로 묶어야 합니다. 특히 뒤에는 임의의 경로를 붙여넣을 수 없습니다 cd. (유일한 특수 문자가 단일 공백인 경우 매개 변수를 연결할 수 있습니다. 그러나 예를 들어 두 개의 연속 공백이 포함된 경로의 경우에는 작동하지 않습니다.) 경로가 클립보드에 있는 디렉터리로 변경하려면 다음과 같은 명령을 사용합니다.

alias cdp='cd "$(powershell.exe -c Get-Clipboard)"'

답변2

cdWindows와 유사한 경로 /zsh 내장만 인식되도록 하려면 다음과 같이 재정의할 수 있습니다.pushd

cd pushd() {
  emulate -L zsh
  set -o extendedglob
  local match
  if [[ $argv[-1] = (#bi)([a-z]):(|[\\/]*) ]] argv[-1]=/mnt/$match[1]:l$match[2]:gs:\\:/
  builtin $0 "$@"
}

답변3

그것은 불가능합니다. Unix에서는 cd셸에 내장되어 있습니다(작동하는 데 필요함). 사용하는 zsh 및 bash는 Ubuntu와 함께 제공되며 실제 Linux 시스템과 동일합니다.

Unix 시스템은 이를 단일 상대 디렉토리로 처리합니다. 즉, 이렇게 하면 Unix에서 유효한 단순 경로 구성 요소인 이라는 cd 'C:\Program Files'디렉토리를 현재 디렉토리에서 찾습니다 . C:\Program Files(이것은 Windows에서 유효한 단순 디렉터리 또는 경로 구성 요소가 아니라는 점을 지적해야 합니다.) 따라서 WSL에서 요구하는 것은 Linux에서 요구하는 것과 다릅니다.

"WSL의 Ubuntu에는 왜 이런 특별한 경우가 없나요?"라는 질문이 있는 경우 Ubuntu 및 기타 Linux 배포판은 WSL 배포판을 출시하는 사업이 아니라 실제 Linux 시스템을 출시하는 사업에 속한다는 것입니다. 이상한 Windows 관련 동작이 포함된 코드에서는 유지 관리 부담이 엄청납니다(Windows 또는 Cygwin에서 Git 도구를 유지 관리하는 데 드는 노력의 양을 보면 알 수 있습니다).

또한 WSL에서 작업하는 사람들은 일반적으로 모든 것이 Linux와 동일할 것으로 기대하며 모든 편차는 버그로 간주됩니다. 현재 디렉토리 아래의 디렉토리를 참조하기 위해 콜론과 백슬래시가 포함된 이상한 경로 이름을 사용하고 싶지 않다고 해서 다른 사람들이 그렇게 하지 않을 것이라는 의미는 아니며, 많은 Unix 도구에는 적어도 임의로 다음과 같은 테스트와 가정이 있습니다. -slash , NUL이 아닌 UTF-8은 파일 시스템에 저장될 수 있으므로 이렇게 변경하면 많은 Unix 도구가 중단됩니다.

답변4

나는 단지 ./mnt/(drive name)/Windows/path/to

예를 들어 Windows 경로로 변경하고 싶다면 WSL을 사용할 때 작성 D:\test합니다 cd /mnt/d/test.

관련 정보