WSL2のcdコマンドでWindowsパスを許可するにはどうすればよいですか?

WSL2のcdコマンドでWindowsパスを許可するにはどうすればよいですか?

私はcygwinから来たWSL改宗者です。 Cygwinがすることの1つはUnixを受け入れることです。そしてコマンドのWindowsファイルパスcd。もちろん、ほとんどのWindowsパスには\Unixの特殊文字が含まれていますが、それをエスケープする限り、cdWindowsパスへのingは期待どおりに機能しますcd 'C:\Program Files'あなたのものを変えなさいDディレクトリは/cygdrive/c/Program Files1です。

WSLの場合はそうではありません。cd 'C:\Program Files'エラーメッセージを印刷しますcd: no such file or directory: C:\Program Files

私はcygwinの機能が好きです。cdWSLで使用するときに同じ動作を得る方法はありますか?

sudo apt install <x>解決策は、サードパーティツール(例:)のインストール、エイリアスの作成、私のシェルで何かを有効にする、または自分自身のシェルスクリプトを作成するbindなどの形式です。bindkey私がUnixを使用できるようにする限りそしてWindowsパスをcd引数として使用するとうれしいです。


追加情報

私のディストリビューションはUbuntuです。私は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。 (唯一の特殊文字が単一の空白の場合はパラメータを連結できますが、たとえば、2つの連続した空白を含むパスの場合は機能しません。)パスをクリップボードのディレクトリに変更するには、次のコマンドを実行します。を使用します。

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と同じであると期待し、すべての偏差はバグと見なされます。現在のディレクトリの下のディレクトリを参照するためにコロンとバックスラッシュを含む奇妙なパス名を使用したくないからといって、他の人がそうしないという意味ではありません。 。 -slash、NUL以外のUTF-8はファイルシステムに保存される可能性があるため、これを変更すると多くのUnixツールがクラッシュします。

答え4

私は。/mnt/(drive name)/Windows/path/to

たとえば、Windowsパスに変更したい場合は、WSLを使用して作成しD:\testますcd /mnt/d/test

関連情報