cygwin 里 sh 与 bash 的环境不同怎么办!

2020-04-19 01:58:43 +08:00
 c416593819

我的天,cygwin 里 sh 与 bash 的环境不同怎么办,修改了.bash_profile 只改变了 bash 的环境,sh 的环境没有变! 求大佬指点! 我是 windows10

3681 次点击
所在节点    Linux
20 条回复
c416593819
2020-04-19 02:19:34 +08:00
我在.bash_profile 里 alias 了 python3,然后在 bash 里可以运行,在 sh 里不行。
我想调用一个 makefile,而 makefile 默认调用 sh,虽然可以改成 bash,但我想知道怎么修改 sh 的环境,有个笨办法是每次打开 sh 就 alias 一次。。。。
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
c416593819
2020-04-19 03:20:56 +08:00
@ysc3839 ~/.profile 我改了还是不行。
我发现一个好办法,给需要运行的程序创建个软链接,因为这样会在 /usr/bin/下生成一个链接文件,这样多个 shell 之间就可以直接用了,不用设置环境。
```bash
ln -s /cygdrive/d/WPy64-3680/python-3.6.8.amd64/python.exe /usr/bin/python3
```
c416593819
2020-04-19 03:21:44 +08:00
要是以前有一个不对的软软链接就用 ln -sf
ysc3839
2020-04-19 03:24:08 +08:00
可能是改错了?不过要给第三方软件调用 python 的话也不应该用 alias,alias 是给你自己敲命令时用的。同时如果某个程序不通过 shell,而是直接执行对应文件的话也是无效的。
calmzhu
2020-04-19 06:26:16 +08:00
有了 bash sh 的为什么要管
ipwx
2020-04-19 09:17:21 +08:00
emmm 一般来说写 makefile 这种东西,最好不要和用户个人电脑的环境强绑定才好吧。。。不然哪天你换台电脑执行,就会感觉自己写这个 makefile 忒他么蠢了。说起 makefile,一般做法是使用环境变量确定编译器 /解释器的路径吧。当然还能给个默认值什么的。这样做比你 alias 更灵活。







ipwx
2020-04-19 09:18:30 +08:00
最后一张图少截了一部分,用的是 export 设置了 PYTHON 环境变量的值。

ipwx
2020-04-19 09:20:12 +08:00
而且用这种方式写 Makefile 的话,你大不了再写个额外的脚本,设置好环境变量,然后再调用你的 Makefile 。
c416593819
2020-04-19 11:42:44 +08:00
@ysc3839 原来 alias 是这个意思,我把它理解成像 c 语言的宏之类的东西了。
@calmzhu makefile 默认调用的是 /bin/sh,我不想改它的 SHELL 变量,就想两个统一一下🤦‍
@ipwx 学到了!你这个配置方法更灵活,我终于有点理解了 export 跟 alias
calmzhu
2020-04-19 12:06:47 +08:00
makefile 默认调 sh? 这个也不是 makefile 本身的限制。应该是你哪里不对。
k9982874
2020-04-19 12:10:51 +08:00
你打开 cygwin 命令行如果默认是 sh 的话,执行一下 bash 切换到 bash 环境不就好了🐶
c416593819
2020-04-19 12:32:17 +08:00
@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.
calmzhu
2020-04-19 12:54:46 +08:00
@c416593819
所以在 makefile 里面设置一下 shell 变量。指定到 /bin/bash 就可以了。sh 跟 bash 差别还是挺大的。
calmzhu
2020-04-19 13:00:05 +08:00
好奇问下 makefile 的内容。在 Windows/Mac/Linux 里面跑 make 的时候都不用注意是哪种 shell 。里面有调用了指定 sh 的自定义脚本?
c416593819
2020-04-19 14:13:27 +08:00
@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 比较标准好运行,我是搞硬件的这块儿了解的就比较模糊
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 里的环境变量系统空间不生效的。可能代码做成服务启动后又不一致了。
本地直接写路径,跨平台先约定好内部标准。
c416593819
2020-04-19 18:03:16 +08:00
@calmzhu 学到了!
realpg
2020-04-19 20:44:27 +08:00
没细看 粗略感觉是楼主平时的做法就不太对
让 makefile 去依赖你的环境设置是不靠谱的
zydrsnuo
2020-04-20 08:50:41 +08:00
alias 不可靠,最好看 Makefile 能不能设置环境变量。
1. sh 不一定是 bash,sh 可能是其他 xsh 的软链。
2. 即使 sh 是 bash 的软链,也不一定能读到环境配置,因为 sh 调起 bash 默认会添加--norc 参数,而且非登录 shell 也不会读 profile 。
3. 即使 sh 能读环境变量,alias 也不一定生效,因为非交互式 shell 会忽略 alias

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/663871

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX