Ubuntu

具有命令替換的環境變數未正確設置

  • April 6, 2022

我正在使用 Windows 10 WSL (Ubuntu 20.04) 並試圖讓命令正常工作,但無法設置環境變數。

我需要執行:

export ADB_SERVER_SOCKET=tcp:<variable ip here>:5037

因為在這種情況下,需要替換的 IP 需要來自 Windows,這是我想出的最後一個命令:

export ADB_SERVER_SOCKET=tcp:$(cmd.exe /C ipconfig | grep "IPv4" | awk 'NR==1{print $14}'):5037

在這種情況下,cmd.exe命令會列印出來:

cmd.exe /C ipconfig | grep "IPv4" | awk 'NR==1{print $14}'
192.168.0.11

但是,如果我在執行它後檢查變數是什麼,我會得到:

echo "$ADB_SERVER_SOCKET"
:503792.168.0.11

我也嘗試在整個內容周圍添加引號,但輸出似乎總是相同的。我認為無論出於何種原因,它都會用 :5037 替換 tcp:1 。

我怎樣才能讓它工作?

正如RudiC在評論中正確提到的那樣:

… windows 命令的輸出有一個尾隨 (\r, 0x0D, ^M) 字元,該字元使該行向後折疊並在 pos 1 處繼續。

Carriage Return ( CR) 和Line Feed ( LF) 來自打字機時代:CR將導致滑軌(托架)返回到其起始位置(最左側),同時LF將導致紙捲在下一行中進給。

Windows 行結尾總是CRLF,而 Unix 行結尾是LF.

額外CR的導致游標跳回第一個位置,覆蓋之前的位置。

如果您刪除它(tr例如),您將獲得預期的輸出。

echo tcp:$(cmd.exe /C ipconfig | grep "IPv4" | awk 'NR==1{print $14}' | tr -d $'\r'):5037

引用自:https://unix.stackexchange.com/questions/698240