这里写目录标题
一、问题描述
- 如题:在Linux环境下(Redhat 和 Ubuntu),双击可执行的.sh文件,点击
Execute
或者Execute in Terminal
没反应,或者有时能看到一个小黑框一闪而过.
二、解决思路
一般情况下都是.sh脚本中代码bug,或者环境变量有问题.
1. 开启终端,使用命令行运行.sh脚本文件
- 不要直接双击sh运行,而是先开终端,使用./xxx.sh运行脚本文件
- 报错不会闪退,会在终端打印相关问题,依此排查
2. 终端中运行可以,但双击之后运行闪退 (遇到了个这个奇奇怪怪的问题)
- 可先排查.bashrc文件中是否配置有误. (
当登录时以及每次打开新的shell时,该文件被读取
) - 是否已经设置好变量:
.bashrc设置的变量如果不export,只在终端中生效,在脚本中无法调用
- 也可能在多个文件中设置了相同的变量,导致冲突、覆盖等.
双击运行脚本 - 即便选择 run in termial - 可能也不会调用.bashrc
三、分析记录
奇怪的问题:打开终端可以./xx.sh运行脚本,但是双击就闪退,或者根本无反应. 做了个简单的测试:
3.1 .bashrc设置变量的作用域
-
- 在.bashrc中添加如下代码,同时新建一个cs.sh脚本,输出bashrc_CS的值:
- 在.bashrc中添加如下代码,同时新建一个cs.sh脚本,输出bashrc_CS的值:
bashrc_CS="bashrc_CS"
#!/bin/bash
echo "$bashrc_CS"
-
- 开启终端,在终端中可正常输出"$bashrc_CS",但是脚本中为空。
- 开启终端,在终端中可正常输出"$bashrc_CS",但是脚本中为空。
3.2 环境变量冲突覆盖问题.
-
- 在.bash_profile(.profile)和.bashrc中添加如下代码:
CS="profile_CS"
export CS
CS="bashrc_CS"
-
- 写一个测试脚本,比较在终端中运行和双击后运行的结果:
- 写一个测试脚本,比较在终端中运行和双击后运行的结果:
-
- 双击运行cs.txt中显示的是
profile_CS
,在终端中运行显示bashrc_CS
。
- 双击运行cs.txt中显示的是
至此,之前双击运行脚本闪退的原因已找到. 双击运行和在终端中运行还是有差别的
。