我想組合一個呼叫 bash/wsl 并在 bash 的作業目錄上運行以下代碼的 PowerShell 腳本:
for f in $(find -type l);do cp --remove-destination $(readlink $f) $f;done;
我似乎所能做的就是讓 wsl 更改目錄:
param (
[Parameter(Mandatory=$true,Position=0)]
[String]$Folder
)
wsl.exe --cd $Folder
我試過了:
wsl -c 'for f in $(find -type l);do cp --remove-destination $(readlink $f) $f;done;'
wsl.exe 'for f in $(find -type l);do cp --remove-destination $(readlink $f) $f;done;'
wsl.exe此外,由于某種原因,在我第一次呼叫后,我無法獲得任何額外的命令。例如,以下內容不起作用:
param (
[Parameter(Mandatory=$true,Position=0)]
[String]$Folder
)
wsl.exe --cd $Folder
wsl.exe echo "Hello World" # Never executes
在這方面,我對 linux 和 Ubuntu 非常缺乏經驗,所以我覺得我錯過了一些非常簡單的東西——因此這篇文章。
如何從 Windows Powershell 7 執行 bash/wsl2 命令?
非常感謝任何幫助。
uj5u.com熱心網友回復:
我有一種感覺,我錯過了一些非常簡單的東西
并不真地。以我的經驗,從另一種腳本語言呼叫一種腳本語言很少是我所說的“簡單”;-)。
這是從幫助中找出答案的一個很好的嘗試,但不幸的是,wsl --help輸出中沒有足夠的細節來從中找出答案。
但是,如幫助中所述,有一些構造可用于使用命令在 WSL 實體中運行wsl.exe命令。
wsl <commandline>: 將命令列作為默認 shell 的引數運行。wsl -e <command>:代替shell運行命令
請注意,為了安全起見,我將用更良性的版本替換您的命令列;-)。
for f in $(find -xdev -type l); do echo $f "----" $(readlink $f); done
旁注find:正如有人曾經在我使用with時向我指出的那樣for——為什么回圈查找的輸出是不好的做法?, 所以它確實會更好find -xdev -type l | xargs -I % sh -c "echo -n % '---- '; readlink %",但是我們將把它留在一個for回圈中來演示這里的部分問題。
以下兩次嘗試失敗,因為...
wsl --cd ~ -c 'for f in $(find -xdev -type l); do readlink $f; done'-c不是一個可以理解的標志wsl.exewsl.exe --cd ~ 'for f in $(find -xdev -type l); do readlink $f; done'這相當于 runningcd ~; for f in $(find -xdev -type l); do readlink $f; done,當然也不起作用。實際上,回想起來,這可能對你有用。它對我來說失敗了,因為我的默認 shell 是 Fish,但
wsl似乎確實嘗試使用-c傳入的任何命令列運行默認 shell。它可能對您來說失敗了,因為您
--cd在呼叫它之前沒有在同一命令列上設定目錄(通過)。wsl.exe --cd ~ -e 'for f in $(find -xdev -type l); do readlink $f; done'而且,雖然您沒有提到嘗試這個,但這個特定的也不會作業,因為它
-e需要是一個“命令”,但這是一個完整的命令列,帶有 shell 內置函式,例如for.
“Aaargggh!”,你一直在說,對吧?抓到22?您需要-c進入shell,但wsl命令無法通過它。
所以,我們使用:
wsl --cd ~ -e sh -c 'for f in $(find -xdev -type l); do echo $f "----" $(readlink $f); done'
那:
- 對主目錄的更改(
$FOLDER當然,您可以用 PowerShell 中的變數替換) - 執行
shshell(如果你需要它的任何構造,你也可以使用 Bash(或任何其他 shell 或命令)) - 將命令列 via 傳遞
-c給 shell。對于大多數 shell、POSIX 或其他方式來說,這是一個相當正常的引數。
請注意(根據經驗),PowerShell 和 WSL/sh 之間的參考規則可能會變得相當“不守規矩”。我發現隨著示例變得越來越復雜,最好將 shell 命令放在WSL 中的腳本中,然后從 PowerShell 中執行該腳本。例如,類似:
wsl --cd ~ -e sh -c "~/.local/bin/myscript.sh"
--cd筆記
使用兩個單獨wsl的命令,例如您的--cd示例:
wsl.exe --cd $Folder
wsl.exe echo "Hello World" # Never executes
假設您是通過腳本執行的,第一行:
- 更改到指定目錄
- 運行默認 shell,因此您將處于互動式會話中
如果您隨后退出shell(Ctrl D或exit),那么您應該會看到第二個命令的輸出。
如果您通過以下方式從 PowerShell 運行它,您也可以互動式地看到它:
wsl --cd ~ ; wsl echo Hello
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/465464.html
