WSL에서 Windows exe를 확장자없이 실행

4234 단어 WSLBash
Windows Subsystem for Linux에서는 Windows 응용 프로그램을 직접 실행할 수 있습니다. PATH가 다니면 단순히$ explorer.exe그러면 탐색기가 시작됩니다. 그러나 반드시 확장자까지 포함해야 합니다.
명령 프롬프트에서 실행할 때처럼 확장자를 생략하고 실행하는 방법입니다.

명령 프롬프트에서 확장명을 생략할 수 있는 이유



애초에 왜 Windows 명령 프롬프트와 PowerShell에서 .exe, .cmd 등의 확장자를 생략 할 수 있을까요? . 이 값은 명령 프롬프트에서 확인할 수 있으며 필자의 환경에서는.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC되었습니다.
이것과 같은 일을 하면 할 수 있을 것 같습니다.

구현



Windows 측 설정



WSL과 환경 변수를 공유하려면 WSLENV라는 환경 변수를 사용합니다.
제어판 등으로 PATHEXT를 WSLENV에 추가하기만 하면 됩니다.


WSL 측 설정



명령을 찾을 수 없으면 PATHEXT에서 확장자를 검색하고 다시 검색하기 위해 command_not_found_handle을 사용합니다. 이미 정의된 경우 처리를 삽입하고 다시 정의합니다.

.bashrc
if declare -f command_not_found_handle >/dev/null 2>&1; then
  eval 'command_not_found_handle() {
    local ext
    for ext in ${PATHEXT//;/ }; do
      if which "$1$ext" >/dev/null 2>&1; then
        "$1$ext" "${@:2}"
        return $?
      fi
    done
    '"$(declare -f command_not_found_handle|tail -n +2)"'
  }'
else
  command_not_found_handle() {
    local ext
    for ext in ${PATHEXT//;/ }; do
      if which "$1$ext" >/dev/null 2>&1; then
        "$1$ext" "${@:2}"
        return $?
      fi
    done
    printf "%s: command not found\n" "$1" 1>&2
    return 127
  }
fi

실행



여담이지만 NTFS는 파일 이름의 대소문자를 구분하지 않으므로 명령 이름의 대소문자가 다르더라도 실행할 수 있습니다.


결론



PATH가 다니면 보완이 효과가 있고, 그다지 의미는 없는 생각도 한다.

추가 (2020/05/25 19:53)



여러가지 만지면 짧아졌기 때문에 그것도 올려 둡니다.

.bashrc
eval 'command_not_found_handle() {
  local ext
  for ext in ${PATHEXT//;/ }; do
    if which "$1$ext" >/dev/null 2>&1; then
      "$1$ext" "${@:2}"
      return $?
    fi
  done
  '"$(declare -f command_not_found_handle|tail -n +2)"'
  printf "%s: command not found\n" "$1" 1>&2
  return 127
}'

참고문헌



Linux와의 Windows 상호 운용성

좋은 웹페이지 즐겨찾기