我的天,cygwin 里 sh 与 bash 的环境不同怎么办,修改了.bash_profile 只改变了 bash 的环境,sh 的环境没有变! 求大佬指点! 我是 windows10
1
c416593819 OP 我在.bash_profile 里 alias 了 python3,然后在 bash 里可以运行,在 sh 里不行。
我想调用一个 makefile,而 makefile 默认调用 sh,虽然可以改成 bash,但我想知道怎么修改 sh 的环境,有个笨办法是每次打开 sh 就 alias 一次。。。。 |
2
ysc3839 2020-04-19 02:22:01 +08:00
本来 bash 和 sh 就是不同的 shell 。要在 sh 中生效的话需要改 ~/.profile
https://unix.stackexchange.com/questions/45684/what-is-the-difference-between-profile-and-bash-profile |
3
c416593819 OP @ysc3839 ~/.profile 我改了还是不行。
我发现一个好办法,给需要运行的程序创建个软链接,因为这样会在 /usr/bin/下生成一个链接文件,这样多个 shell 之间就可以直接用了,不用设置环境。 ```bash ln -s /cygdrive/d/WPy64-3680/python-3.6.8.amd64/python.exe /usr/bin/python3 ``` |
4
c416593819 OP 要是以前有一个不对的软软链接就用 ln -sf
|
5
ysc3839 2020-04-19 03:24:08 +08:00
可能是改错了?不过要给第三方软件调用 python 的话也不应该用 alias,alias 是给你自己敲命令时用的。同时如果某个程序不通过 shell,而是直接执行对应文件的话也是无效的。
|
6
calmzhu 2020-04-19 06:26:16 +08:00 via Android
有了 bash sh 的为什么要管
|
7
ipwx 2020-04-19 09:17:21 +08:00
|
8
ipwx 2020-04-19 09:18:30 +08:00
|
9
ipwx 2020-04-19 09:20:12 +08:00
而且用这种方式写 Makefile 的话,你大不了再写个额外的脚本,设置好环境变量,然后再调用你的 Makefile 。
|
10
c416593819 OP |
11
calmzhu 2020-04-19 12:06:47 +08:00 via Android
makefile 默认调 sh? 这个也不是 makefile 本身的限制。应该是你哪里不对。
|
12
k9982874 2020-04-19 12:10:51 +08:00 via iPhone
你打开 cygwin 命令行如果默认是 sh 的话,执行一下 bash 切换到 bash 环境不就好了🐶
|
13
c416593819 OP @calmzhu 我查了查,make 手册里有这么写的一句,而且说 SHELL 变量不从系统环境变量上继承
https://www.gnu.org/software/make/manual/make.html 5.3.2 Choosing the Shell The program used as the shell is taken from the variable SHELL. If this variable is not set in your makefile, the program /bin/sh is used as the shell. The argument(s) passed to the shell are taken from the variable .SHELLFLAGS. The default value of .SHELLFLAGS is -c normally, or -ec in POSIX-conforming mode. Unlike most variables, the variable SHELL is never set from the environment. This is because the SHELL environment variable is used to specify your personal choice of shell program for interactive use. It would be very bad for personal choices like this to affect the functioning of makefiles. |
14
calmzhu 2020-04-19 12:54:46 +08:00 via Android
@c416593819
所以在 makefile 里面设置一下 shell 变量。指定到 /bin/bash 就可以了。sh 跟 bash 差别还是挺大的。 |
15
calmzhu 2020-04-19 13:00:05 +08:00 via Android
好奇问下 makefile 的内容。在 Windows/Mac/Linux 里面跑 make 的时候都不用注意是哪种 shell 。里面有调用了指定 sh 的自定义脚本?
|
16
c416593819 OP @calmzhu
我在 linux 里面的时候也没注意过。 这个是我在 Cygwin 的 zsh 和 bash 里面跑 make,make 调用 python3 跑个 python 脚本,运行后报错提示是 /bin/sh python3 找不到这个命令。我在 bash 的环境变量里面 export 了 python3,在 bash 下也可以$ python3 直接运行,$ sh 切换到 sh 下再运行找不到 python3,所以我才发现是 shell 环境配置不同的问题。 这个跟哪种 shell 关系倒也不大,不过我昨晚网上看的内容大概都是大家喜欢在 make 里面用 sh 这个 shell,说 sh 比较标准好运行,我是搞硬件的这块儿了解的就比较模糊 |
17
calmzhu 2020-04-19 14:31:07 +08:00
@c416593819
这个改 python3 脚本实在点。 makefile 里面 python3 脚本怎么调用的。 直接./a.py argxx 还是 python3 a.py 如果是第一个 在 python3 脚本里面第一行加上 #!/usr/bin/python3 (实际路径) 如果是第二个。 同样建议 python 路径写全 /usr/bin/python3 a.py (实际路径) 环境变量很多坑。比如设置在 user profile 里的环境变量系统空间不生效的。可能代码做成服务启动后又不一致了。 本地直接写路径,跨平台先约定好内部标准。 |
18
c416593819 OP @calmzhu 学到了!
|
19
realpg 2020-04-19 20:44:27 +08:00
没细看 粗略感觉是楼主平时的做法就不太对
让 makefile 去依赖你的环境设置是不靠谱的 |
20
zydrsnuo 2020-04-20 08:50:41 +08:00 via Android
alias 不可靠,最好看 Makefile 能不能设置环境变量。
1. sh 不一定是 bash,sh 可能是其他 xsh 的软链。 2. 即使 sh 是 bash 的软链,也不一定能读到环境配置,因为 sh 调起 bash 默认会添加--norc 参数,而且非登录 shell 也不会读 profile 。 3. 即使 sh 能读环境变量,alias 也不一定生效,因为非交互式 shell 会忽略 alias |