带有命令替换的环境变量未正确设置

带有命令替换的环境变量未正确设置

我正在使用 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

我也尝试过在整个内容周围添加引号,但输出似乎总是相同的。我认为无论出于何种原因,它都将 tcp:1 替换为 :5037 。

我怎样才能让它发挥作用?

答案1

作为鲁迪克评论中正确提及:

... windows 命令的输出有一个尾随 (\r, 0x0D, ^M) 字符,使该行向后折叠并在 pos 1 处继续。

回车CR) 和换行( 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

答案2

您不需要greptr命令。awk可以为你完成这一切(未经测试,因为我没有 Windows 系统):

cmd.exe /C ipconfig | awk '/IPv4/ {sub(/\r$/, "", $14); print $14}'

相关内容