我正在使用 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
您不需要grep
或tr
命令。awk
可以为你完成这一切(未经测试,因为我没有 Windows 系统):
cmd.exe /C ipconfig | awk '/IPv4/ {sub(/\r$/, "", $14); print $14}'