有人说 Windows 10 是世界上最好的 Linux 发行版,这当然是开玩笑的。不过 Windows 10 确实“内置”了一个 Linux,叫作 Windows Subsystem for Linux(WSL),或者如果有人纠结实质的话,得改叫 Windows Subsystem for GNU。
总之我发现这个 WSL 还挺好用的,尤其是诸如 ssh
、whois
的命令用起来很方便,所以 WSL Bash 已经是我的默认终端了。另一方面,我觉得 CMD 的一部分命令也挺好用,比如 ipconfig
。幸而,WSL(本文指 WSL1)允许与 Windows 资源互调用,可以在其提供的 Linux Bash 终端中执行 ipconfig.exe
。如果想要更方便,就得用到 alias(别名)功能了。
在 .bashrc
文件中添加以下内容(如果没有):
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
新建 .bash_aliases
文件,填入:
cmd() {
CMD=$1
if [ -z $CMD ]; then
CMD='cmd'
fi
shift;
ARGS=$@
${CMD}.exe ${ARGS}
}
ipconfig() {
ARGS=$@
if [ -z "$ARGS" ]; then
ARGS='/all'
fi
ipconfig.exe ${ARGS}
}
alias tracert="tracert.exe"
alias tasklist="tasklist.exe"
alias taskkill="taskkill.exe"
alias wping="ping.exe -t"
alias wssh="cp -f ~/.ssh/* /mnt/c/Users/username/.ssh/ && ssh.exe" #将 /c/Users/username/ 换成你的用户目录
alias wnslookup="nslookup.exe"
alias wnbtstat="nbtstat.exe"
alias wnetstat="netstat.exe"
alias wnet="net.exe"
alias wtelnet="telnet.exe"
alias warp="arp.exe"
重启终端,舒服啦。
部分测试用例:
cmd
cmd ping localhost
wping localhost
ipconfig
ipconfig /flushdns
ipconfig /renew WLAN
tracert www.baidu.com
需要解释一下,我的 cmd 函数并非真的使命令在 CMD 中执行,而只是将命令添加 .exe 后缀(当没有提供参数作为命令时执行 cmd.exe 本身),因而像 del
、copy
、dir
这样的 CMD 内部命令是无法执行的。我觉得这样就够了。你如果想要真的在 CMD 中执行,可以参考这些代码:
cmd() {
CMD=$1
shift;
ARGS=$@
WIN_PWD=`wslpath -w "$(pwd)"`
cmd.exe /c "pushd ${WIN_PWD} && ${CMD} ${ARGS}"
}
甚至于你连 cmd 前缀都不想添加,也是可以的(见《WSL与Windows交互实践》5.3 重定向)。只是我觉得都不优雅。
2020-4-17 P.S.修正变量判空方式,避免参数含有空格时报错。添加 tasklist 别名。