Reference
更多cmd.exe幫助參考 cmd_helps
WSL備份及windows Docker安裝
WSL安裝維護
在使用wsl時,總是需要執行windows的cmd,但是windows命令列對於大多數人使用起來還是不習慣,微軟提供了在windows中Linux與Windows的命令互通,即可以使用cmd shell執行Linux命令,也可以使用bash shell來執行windows命令。
WSL可對 Windows 與 Linux 之間的整合操作:
- 從 Linux shell(如 Ubuntu)執行 Windows 工具(任意
.exe
)。 - 從 Windows shell(即 PowerShell or cmd )執行 Linux 命令(如 cd ls grep)。
- 在 WSL與windows之間共享環境變數。 (版本 17063+)
滿足上述要求,可以很好地使用windows的軟體在WSL中暢快的操作,即空WSL環境擁有了python解析器 docker等操作。
如何在 WSL和 Windows 之間共享環境變數
從Build 17063
開始,可以利用 WSLENV
來增強 Win/WSL 之間的環境變數互操作。
什麼是WSLENV
- WSLENV 是一個以冒號分隔的環境變數列表,當從 WSL 啟動 WSL程式或 Win程式時包含的變數
- 每個變數都可以以斜槓作為字尾,後跟標識位以指定它的轉換方式
- WSLENV 可以在 WSL 和 Win32 之間轉換的路徑
- WSLENV。在WSL中,是以冒號分隔的列表。在Win中,是以分號分隔的列表
- 可以在
.bashrc
或者windows自定義環境變數中設定WSLENV
例如:一個WSLENV
應該設定為
WSLENV=GOPATH/l:USERPROFILE/w:SOMEVAR/wp
在17063之前,WSL訪問Windows環境變數唯一方法是使用全路徑(可以使用全路徑從WSL下啟動Win32可執行檔案)。但是沒有辦法在WSL中設定環境變數,呼叫Win程式,並期望將該變數傳送到程式。
在17063之後,引入一個名為WSLENV
的特殊環境變數,以幫助WSL和Win之間的共享。 WSLENV
存在於兩個環境中。使用者可以將WSLENV的值設定為耦合值與環境變數串聯,每個都以 \
為標誌,以指定應該如何解析該變數。例如:
/p
/p
表示應在WSL和Win32之間轉換path。例如。在WSL中設定變數,將其新增到WSLENV設定/p
標誌,然後在win環境cmd.exe中讀取變數,該值會隨著rootfs的轉變而轉換為對應的值。
root@stranger:/mnt/d# export TRANSLATABLE=`pwd`
root@stranger:/mnt/d# echo $TRANSLATABLE
/mnt/d
root@stranger:/mnt/d# export WSLENV=TRANSLATABLE\p
root@stranger:/mnt/d# export WSLENV=TRANSLATABLE/p
root@stranger:/mnt/d# echo $WSLENV
TRANSLATABLE/p
root@stranger:/mnt/d# cmd.exe
Microsoft Windows [版本 10.0.19043.1052]
(c) Microsoft Corporation。保留所有權利。
D:\>set TRANSLATABLE # 在windows中檢視環境變數
TRANSLATABLE=D:\
/l
/l
表示該值是路徑列表(如Linux的PATH)。在Linux中,是以冒號分隔的路徑列表。在Win中,是以分號分隔的路徑列表。/l
可以將路徑列表適當對不通系統進行轉換。
root@stranger:/mnt/d# export TEMPORARY=/usr/local/go/bin:/usr/local/python/bin
root@stranger:/mnt/d# WSLENV=$WSLENV:TEMPORARY/l
root@stranger:/mnt/d# echo $WSLENV
TRANSLATABLE/p:TEMPORARY/l
root@stranger:/mnt/d# cmd.exe
Microsoft Windows [版本 10.0.19043.1052]
(c) Microsoft Corporation。保留所有權利。
D:\>set TEMPORARY
TEMPORARY=\\wsl$\ubuntu1\usr\local\go\bin;\\wsl$\ubuntu1\usr\local\python\bin
/u
/u
表示僅在Linux(WSL)中呼叫變數的值為 Win 型別的變數值,及windows向Linux傳遞環境變數,但格式不變
D:\compose>set zhangsan=D:\compose
D:\compose>set zhangsan
zhangsan=D:\compose
D:\compose>set WSLENV=zhangsan/u
D:\compose>wsl -d ubuntu1
root@stranger:/mnt/d/compose# echo $zhangsan
D:\compose
如需要自動適應轉換,則需要 使用
/up
/w
/w
表示僅在從Win呼叫WSL環境變數是的值,該引數並不會自動轉換,如需轉換一樣需要使用 /wp
。
root@stranger:/mnt/d/compose# export FROMWSL=/mnt/d/compose
root@stranger:/mnt/d/compose# export WSLENV=FROMWSL/w
root@stranger:/mnt/d/compose# cmd.exe
Microsoft Windows [版本 10.0.19043.1052]
(c) Microsoft Corporation。保留所有權利。
D:\compose>set FROMWSL
FROMWSL=/mnt/d/compose
D:\compose>exit
root@stranger:/mnt/d/compose# export WSLENV=FROMWSL/wp
root@stranger:/mnt/d/compose# cmd.exe
Microsoft Windows [版本 10.0.19043.1052]
(c) Microsoft Corporation。保留所有權利。
D:\compose>set FROMWSL
FROMWSL=D:\compose
使用指令碼傳遞變數
如果需要BASH指令碼傳遞對應的變數到windows程式執行,例如
#!/bin/bash
export MYPATH=/mnt/c/Users/
WSLENV=$WSLENV:MYPATH/p cmd.exe /c set MYPATH
通過WSL shell環境執行,可以得到windows程式處理的結果,並且可以拿到環境變數
root@stranger:/mnt/d/compose# bash 1.sh
MYPATH=C:\Users\
例項:設定一個開發環境,使其共享環境變數
例如,希望在WSL中設定DEV環境。使用WSLENV VAR,將其配置為在WSL和Win之間共享GoPath。
安裝golang
首先,我們需要安裝兩個平臺。要在Windows與WSL安裝,步驟不說了。(如果是python等解析語言,可以使用alias直接使用windows的解析器則不需要安裝了)
設定專案
接下來,需要配置的GO專案。該專案需要在Windows檔案系統下。在PowerShell中發出以下命令:(這裡在桌面配置的)
mkdir $env:USERPROFILE\desktop\goProject
cd $env:USERPROFILE\desktop\goProject
New-Item hello.go
配置環境變數,然後將gopath新增到WSLENV,此時,兩個檔案系統間,會使用同一個GOPATH
setx GOPATH "$env:USERPROFILE\desktop\goProject"
setx WSLENV "$env:WSLENV:GOPATH"/p
需要事項
- WSL(通過.profile或其他)中的定義將在通過WSL訪問時覆蓋預設WSLENV中定義的值。
- 在關閉WSL後,WSLENV不會持久化,需要修改相應的配置檔案(.profile,.bash_rc等)。
- WSL可以設定任何值。如果僅設定當前檔案系統變數,則不會自動轉換。通過WSLENV可以自動翻譯成兩種不通的檔案系統下的環境變數。
題外話cmd.exe 跨檔案系統常用引數
options | describe |
---|---|
/C | 使用cmd.exe執行一個命令並終止,類似於 bash -c |
Reference
更多cmd.exe幫助參考 cmd_helps
WSL備份及windows Docker安裝
WSL安裝維護