为何echo $SHELL始终返回/bin/tcsh?bash指定无效原因咨询
为什么脚本中$SHELL始终输出/bin/tcsh?
核心原因很简单:$SHELL环境变量记录的是你的用户登录shell(也就是/etc/passwd里配置的默认shell),而不是当前正在运行的shell进程。不管你临时启动多少个bash子进程,只要没修改登录shell,$SHELL的值就不会变。
咱们逐个拆解你的场景:
场景1:直接执行./test.sh
脚本开头的#!/bin/bash确实会让系统调用bash来执行脚本,但bash作为子进程,会继承父进程(你的tcsh终端)的环境变量——其中就包括$SHELL=/bin/tcsh,所以脚本里echo出来的自然是这个值。
场景2:先进入bash交互shell再执行脚本
你输入bash进入bash交互环境后,这个bash进程依然继承了父tcsh的环境变量,所以此时bash里的$SHELL还是/bin/tcsh。如果想确认当前是不是bash,可以执行echo $0,你会看到输出bash,这才是当前运行的shell名称。
场景3:用bash ./test.sh直接执行脚本
和场景1本质一样:bash作为子进程启动脚本,继承父tcsh的$SHELL变量,所以输出还是/bin/tcsh。
额外说明:怎么让$SHELL变成/bin/bash?
如果你想永久修改$SHELL的值,需要修改你的登录shell,用chsh命令:
chsh -s /bin/bash
执行后重新登录终端,此时$SHELL就会变成/bin/bash了——因为这时候你的登录shell已经改成bash,环境变量会从这里初始化。
内容的提问来源于stack exchange,提问作者DXZ
相关产品推荐
相关产品推荐

