V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
c416593819
V2EX  ›  Linux

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

  •  
  •   c416593819 · 2020-04-19 01:58:43 +08:00 · 3687 次点击
    这是一个创建于 1682 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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







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

    ipwx
        9
    ipwx  
       2020-04-19 09:20:12 +08:00
    而且用这种方式写 Makefile 的话,你大不了再写个额外的脚本,设置好环境变量,然后再调用你的 Makefile 。
    c416593819
        10
    c416593819  
    OP
       2020-04-19 11:42:44 +08:00
    @ysc3839 原来 alias 是这个意思,我把它理解成像 c 语言的宏之类的东西了。
    @calmzhu makefile 默认调用的是 /bin/sh,我不想改它的 SHELL 变量,就想两个统一一下🤦‍
    @ipwx 学到了!你这个配置方法更灵活,我终于有点理解了 export 跟 alias
    calmzhu
        11
    calmzhu  
       2020-04-19 12:06:47 +08:00 via Android
    makefile 默认调 sh? 这个也不是 makefile 本身的限制。应该是你哪里不对。
    k9982874
        12
    k9982874  
       2020-04-19 12:10:51 +08:00 via iPhone
    你打开 cygwin 命令行如果默认是 sh 的话,执行一下 bash 切换到 bash 环境不就好了🐶
    c416593819
        13
    c416593819  
    OP
       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
        14
    calmzhu  
       2020-04-19 12:54:46 +08:00 via Android
    @c416593819
    所以在 makefile 里面设置一下 shell 变量。指定到 /bin/bash 就可以了。sh 跟 bash 差别还是挺大的。
    calmzhu
        15
    calmzhu  
       2020-04-19 13:00:05 +08:00 via Android
    好奇问下 makefile 的内容。在 Windows/Mac/Linux 里面跑 make 的时候都不用注意是哪种 shell 。里面有调用了指定 sh 的自定义脚本?
    c416593819
        16
    c416593819  
    OP
       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
        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 里的环境变量系统空间不生效的。可能代码做成服务启动后又不一致了。
    本地直接写路径,跨平台先约定好内部标准。
    c416593819
        18
    c416593819  
    OP
       2020-04-19 18:03:16 +08:00
    @calmzhu 学到了!
    realpg
        19
    realpg  
       2020-04-19 20:44:27 +08:00
    没细看 粗略感觉是楼主平时的做法就不太对
    让 makefile 去依赖你的环境设置是不靠谱的
    zydrsnuo
        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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2821 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 00:19 · PVG 08:19 · LAX 16:19 · JFK 19:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.