在我之前的(Win 7)机器上,我安装了 CygWin,它允许(由于 PATH)我从任何命令 shell 调用 Linux 命令——默认命令 shell、Anaconda 命令等等。
我希望在我的新 Win 10 上拥有同样的功能。我安装了 Linux 子系统(Ubuntu),但我看不到任何允许在其他 shell 中使用 Linux 命令的方法?
有没有办法实现这一点,或者我应该只安装 CygWin?
答案1
Linux 实用程序可以通过两种方式在 Windows 上运行:-
- 将代码编译为本机 Windows .EXE 文件:这就是 CygWin 所做的,即所有单独的实用程序都可以单独从 Windows shell 直接调用。
- 在 Windows 中提供一个环境,其中 Linux 本机 ELF 二进制文件可以运行,方式类似于 Linux 在 Wine 下运行 Windows 程序:这就是 Windows Subsystem for Linux 所做的,并且单个程序在该环境之外不会被识别为可执行文件。
bash.exe
WSL 环境在运行时启动,您可以通过调用来运行 WSL 实用程序bash.exe
,例如:
bash -c ls
如果需要传递参数,则需要引用命令字符串,例如:
bash -c 'ls -l ./Documents/'
我还没有检查 CygWin,但是一些本机 Windows 端口允许其运行字符串具有灵活性(例如,/
代替-
选项,\
代替/
目录分隔符) - 使用 WSL 时,您将需要使用严格的 Linux 运行字符串。
答案2
这可能是从 Windows 环境执行 Linux 程序 (WSL)
正如我在这个问题中回答的那样,要运行 Linux 命令,您需要使用选项调用bash
。如果路径尚未采用 Linux 格式,-c
您还需要使用将路径转换为 Linux 版本。例如,要运行,请像这样调用它wslpath
grep
E:\somefile
bash -c "grep 'my string' $(wslpath 'E:\somefile')"
请注意单引号不是 cmd.exe 中的特殊字符,因此你在 cmd 中必须使用双引号.bash -c 'ls -l ./Documents/'
就像 AFH 所说的那样行不通。另一方面,在 PowerShell 中,''
和""
都用于引用,其含义与 bash 中相同,因此您可以bash -c 'echo -e "some string"'
从 PowerShell 调用而不会出现问题
然而,PowerShell 中也有各种类似 Linux 的别名,如、、ls
... ,因此在很多情况下,你可以使用它们而不必借助 WSL bashcat
man
如果您使用 Cygwin,那么每个 Unix 实用程序都将编译成单独的 *.exe 文件。您可以运行which ls
或which grep
轻松获取它们的路径。它们直接在 Windows 环境中运行,而不是在 WSL 中运行,WSL 是一个单独的子系统