win10的Linux子系统下make错误

问题描述:

今天我在win10的linux子系统下运行make时,收到报错:Syntax error: “(“ unexpected。在网上查了好多资料,终于让我找到了原因

原因

正常原因

主要是因为Linux系统shell版本不兼容引起的。 shell的版本有sh,ksh,csh, bash,dash……等等。用命令ls -al /bin/sh可以得到我们当前所用的Linux系统的shell属于何版本。
dash相比bash过于严格了

win10的linux子系统原因

win10的linux子系统(我的是ubuntu)的环境变量读取的win10自己的环境变量,而win10的环境变量路径里有空格和括号的存在,如“Program Files (x86)”,而linux下的shell读取环境变量时有空格或者括号就会报错。

解决方法

正常解决方法

通过将当前通过以下方式可以使 shell 切换回 bash:

1
sudo dpkg-reconfigure dash

然后选择 no 或者“否 ”,并确认。这样做将重新配置 dash,并使其不作为默认的 shell 工具。

win10的linux子系统的解决方法

更改linux子系统的环境变量
输入env显示所有的环境变量
找到PATH这一行,复制到一个编辑器中,把后面路径中带有括号和空格的都删掉
例如我的PATH变量为

1
PATH=/home/dxy/bin:/home/dxy/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/ProgramData/Oracle/Java/javapath_target_46965500:/mnt/c/Windows/System32:/mnt/c/Windows:/mnt/c/Windows/System32/wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0:/mnt/c/Program Files (x86)/NVIDIA Corporation/PhysX/Common:/mnt/d/Program Files/Git/cmd:/mnt/d/Program Files/nodejs:/mnt/c/Program Files (x86)/scala/bin:/mnt/c/Program Files/Intel/WiFi/bin:/mnt/c/Program Files/Common Files/Intel/WirelessCommon:/mnt/d/Program/MongoDB/bin:/mnt/c/Windows/System32:/mnt/c/Windows:/mnt/c/Windows/System32/wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0:/mnt/d/Program Files (x86)/Microsoft SQL Server/100/Tools/Binn:/mnt/d/Program Files/Microsoft SQL Server/100/Tools/Binn:/mnt/d/Program Files/Microsoft SQL Server/100/DTS/Binn:/mnt/d/Program Files (x86)/Microsoft SQL Server/100/Tools/Binn/VSShell/Common7/IDE:/mnt/d/Program Files (x86)/Microsoft SQL Server/100/DTS/Binn:/mnt/c/Windows/System32/OpenSSH:/mnt/c/Program Files/Java/jdk1.8.0_131/bin:/mnt/c/Program Files/Java/jdk1.8.0_131/jre/bin:/mnt/d/Program/apache-maven-3.5.3/bin:/mnt/d/Program/Android/sdk/platform-tools:/mnt/d/Program Files (x86)/Tesseract-OCR:/mnt/d/Program/Ruby24-x64/bin:/mnt/d/Program/Anaconda2:/mnt/d/Program/Anaconda2/Library/bin:/mnt/d/Program/Anaconda2/Scripts:/mnt/c/Users/lenovo/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/lenovo/AppData/Roaming/npm:/snap/bin

修改后为

1
PATH=/home/dxy/bin:/home/dxy/.local/bin:/home/dxy/bin:/home/dxy/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Windows/System32:/mnt/c/Windows:/mnt/c/Windows/System32/wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0:/mnt/c/Windows/System32/OpenSSH:/mnt/c/Users/lenovo/AppData/Local/Microsoft/WindowsApps:/snap/bin

然后编辑/etc/profile文件

1
sudo vim /etc/profile

在文件末尾添加修改后的PATH变量,修改后内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "$PS1" ]; then
if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi

if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
PATH=/home/dxy/bin:/home/dxy/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Windows/System32:/mnt/c/Windows:/mnt/c/Windows/System32/wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0:/mnt/c/Windows/System32/OpenSSH:/mnt/c/Users/lenovo/AppData/Local/Microsoft/WindowsApps:/snap/bin

输入下面的命令时环境变量生效

1
source /etc/profile

改完之后我再次执行make命令就没问题了

后记

win10下的linux子系统挺好用的,磁盘共享,内存共享,感觉有了这个,使用linux系统时就不用再单独创建虚拟机了
但win10下的linux子系统使用的win10自己的环境变量,这一点就会有问题,如上面的问题,win10下装的软件在linux子系统下也不能用,建议还是自己在linux子系统下安装需要的软件吧

打赏

请我喝杯咖啡吧~

支付宝
微信