2017-09-20 143 views
3

我想在Windows 10的命令行中使用ls和许多其他Linux工具。我知道有GnuWin32和其他二进制替换,但这些工作都不如Linux子系统(WSL)的优雅, ;包括更新机制。如何在Windows命令行中通过WSL调用Linux命令?

有了WSL,人们可以通过bash -c "ls ..."从命令行调用ls ...,这很好用。然而,理想情况下,我只需在命令行输入ls。我可以创建一个ls.bat,它基本上是@bash -c "ls %*" - 但我必须为每个要导出的命令执行此操作。有没有更直接的方式将ls(以及其他许多)导出到命令行?

+1

WSL中提供的bash命令不打算在WSL之外使用。如果实施了,我会感到惊讶。 – ifconfig

+0

@ifconfig嗯,它并没有打算或实施。我会很高兴用一行一行的“众多”知名Linux命令来对各自的WSL命令进行别名。 – bers

回答

1

显然这是most requested feature for WSL,微软现在支持这个功能。要从命令提示符(或PowerShell)中使用linux命令,只需在命令前加上wsl即可。因此,例如,以下是您如何从CMD运行ls

C:\temp> wsl ls 
<- contents of C:\temp -> 

或者您可以通过如下方式更新软件包列表。

C:\temp> wsl sudo apt-get update 
[sudo] password for username: 
Hit:1 http://archive.ubuntu.com/ubuntu xenial InRelease 
Get:2 http://security.ubuntu.com/ubuntu xenial-security InRelease [94.5 kB] 

更多详细信息请参见official docs。 我不确定您是否正在寻找不涉及任何种类前缀的解决方案。如果是这样,我还不知道任何解决方案。

+0

再见,Cygwin! – bers

+0

'wsl ls ...'肯定比'bash -c“ls ...更加可打字,”是的,这回答了我的问题。 – bers

4

微软不直接支持你问然而,对于...

  • 您可以创建一个“Console Alias”使用Doskey.exe的,但这些 控制台别名是不是持久的(当你打开一个新的命令 提示窗口他们都没了)。
  • CMD /?告诉我们以下两个注册表项:HKey_Local_Machine\Software\Microsoft\Command Processor\AutoRunHKey_Current_User\Software\Microsoft\Command Processor\AutoRun,它(只要不是指定的/D选项中)都将用于内容的运行进行检查(按顺序),当一个新的命令提示符窗口打开。

如果我们用FOR循环,并在您的用户文件夹一个很好的,很容易定制文件把这两个东西放在一起,我们可以得到什么,我想你想要一个漂亮的接近。
我打算把它放在HKLM中,并引用%USERPROFILE%中的一个文件,名为exportlinuxcommands,这样它就可以供所有用户使用,但可以根据每个用户轻松进行自定义,并且仅对用户进行设置向上。如果您只希望为一位用户提供服务,或者不希望其针对每位用户进行定制,则必须稍微修改说明。

  1. 打开注册表编辑器
  2. 转到HKey_Local_Machine\Software\Microsoft\Command Processor
  3. 右键单击窗口的空白部分,然后选择“新建”>“字符串值”(或“可扩充字符串值”,但扩展似乎有点毫无意义,当你意识到命令处理器将扩大他们反正读取值之后。)
  4. 将它命名为“自动运行”(不带引号)
  5. 刚创建
  6. 新的值双击
  7. 输入IF EXIST %USERPROFILE%\exportlinuxcommands FOR /F %i in (%USERPROFILE%\exportlinuxcommands) DO @doskey %i=bash -c "%i $*"作为“数值数据”。

现在你只需要做出一个文件在您%USERPROFILE%文件夹(即C:\Users\YourUserName)称为exportlinuxcommands,每个Linux命令你想要一个别名在单独一行。例如:

ls 
rm 
cat 

要删除一个?将其从文件中删除,并且它不会出现在您打开的下一个命令提示符窗口中。
想再添加一个吗?只需将它添加到它自己的行上的文件中,下次打开命令提示符窗口时,它就会在那里。

+0

这非常整齐!我仍在努力在当前的工作目录中启动'bash'(似乎大部分时间都在工作,但并不总是),但除此之外,这与我想要做的非常接近。但是,我猜想,使用管道('some-windows.exe | grep')工作会稍微复杂些。 – bers

+0

什么时候bash没有在当前工作目录中启动? – 3D1T0R

+0

不幸的是,doskey别名不起作用,除非它们在命令行的开头。这是一个有意的功能,它允许您使用与dos命令同名的别名,并且仍然可以通过在该行的开头添加空格来运行命令本身。 – 3D1T0R