我正在使用 WSL1 運行 Ubuntu,並且我想在 Windows 中創建不同的快捷方式以在 WSL 啟動時運行不同的命令,例如,一個用於自動啟動 SSH 會話,另一個用於更改到特定目錄。執行啟動命令後,我需要它像平常一樣繼續運行,但我嘗試過的所有操作都會關閉終端。我試過類似的東西
c:\windows\system32\bash.exe -c -i -s ssh ip
但它似乎沒有做任何事情,或者即使有,它關閉得太快,我看不到。
答案1
首先,我建議您使用較新的(Microsoft 推薦的)wsl.exe
命令,而不是bash.exe
. bash.exe
仍然可用,但微軟稱其為“歷史命令”,已被“取代” wsl.exe
。該wsl
命令還提供了比舊命令更多的選項bash.exe
。
您遇到的第一個問題是命令列中存在語法/引用錯誤,所以是的,Windows 終端機選項卡在您可以閱讀之前就關閉了。最好先從 PowerShell 或 CMD 設定檔/標籤執行此命令,以便能夠看到輸出:
PS> bash.exe -c -i -s ssh ip
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
[-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
[-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
[-i identity_file] [-J [user@]host[:port]] [-L address]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-Q query_option] [-R address] [-S ctl_path] [-W host:port]
[-w local_tun[:remote_tun]] destination [command]
PS> bash.exe -c "ssh ip"
user@ip's password:
PS> wsl ssh ip
user@ip's password:
PS> wsl -e bash -c ssh ip
<displays usage information as above>
PS> wsl -e bash -c "ssh ip"
user@ip's password:
正如您所看到的,如果您將命令字串傳遞給bash -c
,則需要將其加引號。否則,bash 只會看到ssh
沒有ip
.
wsl
另一方面,該命令做允許直接調用而無需引號。它基本上足夠聰明,可以將命令行的其餘部分(在處理所有參數/標誌之後)傳遞到預設 shell,並引用參數-c
。您可以透過上面的wsl ssh ip
.
接下來您想知道如何在執行命令後保持選項卡/shell 開啟。這可以透過多種方式完成,但最簡單的是:
- 啟動一個外殼
- 運行第一個命令
exec
將繼續運行的替換外殼
正如您所經歷的,僅執行前兩項操作就會導致 shell 在命令退出時關閉。
這看起來像:
wsl -e bash -c "ls; exec bash"
答案2
C:\Windows\System32\cmd.exe /k wsl /path/to/script.sh
/k 開關使 cmd 不退出,以便您可以讀取輸出。 wsl 沒有類似的開關。