背景

不想听我罗嗦,可以直接跳转到最后。

笔记本买回来自带windows10,然后由于好奇心重,又给它折腾装上了ubuntu(本来是想支持国产deepin,奈何问题太多)。万恶之源开始,ubuntu很多常用软件没法直接用apt安装,安装完微信,使用微信一会儿会自动退出登录,无奈卸载。但问题是:非dpkg/apt/snap方式安装,卸载也不知道怎么卸载,于是查找 wechat关键字,找到一个 wechat.sh。

解决

查看脚本

部分help代码如下

help(){echo "wechat [-h] [-i] [-f] [-c] [--start|start] [--remove] [--instance]"echo "  -h, --help            Show help"echo "  -i, --install         Install this script to system"echo "  -f, --force           Force install or reinstall"echo "  -c, --clean           Clean all wechat container"echo "      --start           Start wechat"echo "      --update          Update script"echo "      --remove          Remove this script"echo "      --instance        Create a instance wechat container, you can create more then one using this option"return 0
}

执行脚本

./wechat.sh --remove

没有任何反应。。。看了下remove函数的代码,应该会把 wechat.sh文件给删除的,但是文件依然还在,可以断定执行未成功

remove(){[ -e ~/.local/bin/wechat.sh ] && rm -f ~/.local/bin/wechat.sh\&& echo "remove ~/.local/bin/wechat.sh"[ -e ~/.local/bin/wechat ] && rm -f ~/.local/bin/wechat[ -e ~/.local/share/icons/hicolor/256x256/apps/WINE_WECHAT.png ] \&& rm -f ~/.local/share/icons/hicolor/256x256/apps/WINE_WECHAT.png\&& echo "remove ~/.local/share/icons/hicolor/256x256/apps/WINE_WECHAT.png"[ -e /home/$(whoami)/.local/share/applications/Wechat.desktop ] \&& rm -f /home/$(whoami)/.local/share/applications/Wechat.desktop\&& echo "remove ~/.local/share/applications/Wechat.desktop"return 0
}

调试脚本

sh -x ./wechat.sh --remove

提示如图


第148行代码如下

 while [[ $# > 0 ]];do

问题解决

修改执行方式
before:

$ sh wechat.sh

after:

$ bash wechat.sh

注意:
查看.sh脚本的时候一定要看第一行
wechat.sh 的第一行:

#!/usr/bin/env bash

要区分两种情况
#!/bin/bash
或者是
#!/bin/sh

扩展bash vs sh

什么是sh

sh(或Shell命令语言)是由POSIX标准描述的一种编程语言。它有很多实现(ksh88, dash,…)。bash也可以被认为是sh的实现(请参阅下面的内容)。
因为sh是规范,不是实现,/bin/sh 是在大部分POSIX系统上实际实现的符号连接(or 硬链接)。

什么是bash

bash是兼容sh的一种实现(虽然在几年之前被视为POSIX标准),但随着时间流逝,它需要更多的扩展。这里面的一些扩展会改变有效的POSIX shell脚本的行为,所以bash本身不是有效的POSIX shell。然后它是POSIX shell语言的方言。
bash 可以执行--posix切换,使得它更加的兼容POSIX,同时也尝试通过调用sh来模仿POSIX。

sh=bash?

长期以来,在大部分GNU/Linux系统上,/bin/sh都是指向/bin/bash。结果,几乎可以忽略两者之间的区别了。 但是这种情况最近开始改变。

/bin/sh不指向/bin/bash(在某些情况下甚至都不存在/bin/bash)的系统中,一些常见的例子是:
1.现代的debian和ubuntu系统上,sh默认是dash的符号链接
2.Busybox,它通常在Linux系统引导时作为initramfs的一部分运行。它使用了ash shell实现。
3.BSDs,以及通常所有非linux系统。OpenBSD 使用pdksh,Korn shell的后代。FreeBSD的sh是原始UNIX Bourne shell的后代。Solaris有它自己的sh但长期以来都不是与POSIX兼容的,是一种Heirloom项目提供的一个开源实现。

如何找到/bin/sh在我们系统上的指向

/bin/sh的复杂之处是:它可以是符号链接也可以是硬链接。
如果是符号链接,可以通过如下方式:

% file -h /bin/sh
/bin/sh: symbolic link to bash

如果是硬链接,可以尝试:

% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

实际上-L标志同时包括符号链接和硬链接,但是这种方法的缺点是它不是可移植的,POSIX不需要find来支持-samefile选项,尽管GNU find和FreeBSD find都支持它。

Shebang

在计算领域中,Shebang(也称为Hashbang)是一个由井号和叹号构成的字符序列#!,其出现在文本文件的第一行的前两个字符。

最终,通过在脚本的第一行编写Shebang来决定使用sh还是bash:
比如使用sh

#!/bin/sh

又或者使用/bin/bash如果可用(如果不可用会失败并带上错误信息)

#!/bin/bash

当然你也可以选择另外一个实现,比如

#!/bin/dash

到底用哪个

在我的脚本里,倾向于使用sh有以下原因:

  1. 它是标准的
  2. 非常简单并且易学
  3. 便携并且跨POSIX系统,即使碰巧没有bash,也需要有sh

使用bash也有优点。它的特性使编程更加方便,并且类似于用其他现代编程语言进行编程。这些包括作用域局部变量和数组之类的东西。纯sh是一种非常简约的编程语言。

参考

string-comparison-in-bash-not-found
difference-between-sh-and-bash

执行sh脚本提示“[[: not found”解决方案,bash和sh的区别相关推荐

  1. Linux终端执行shell脚本,提示没有权限

    Linux终端执行shell脚本 问题:提示没有权限 执行命令:./test.sh,提示没有权限. 解决方案: 提示:修改脚本文件test.sh的权限 执行命令:chmod 777 ./test.sh ...

  2. shell脚本报错问题: -bash: ./test.sh: /bin/sh^M: bad interpreter: No such file or directory

    今天写了一个shell脚本,然后在执行的时候报错,脚本内容很简单,仅供测试: Shell代码:   #!/bin/sh    echo "test shell "  具体报错信息如 ...

  3. Linux执行shell脚本提示文件找不到问题解决办法

    在Linux系统下执行已存在的shell脚本,但是执行时提示你文件不存在. 此时一般原因是shell脚本编写时的系统跟执行脚本的系统不一致,比如在window系统编写脚本,拷贝到Linux系统执行时就 ...

  4. QC在windows7远程执行QTP脚本无法读excel解决方案

    原文地址:http://bbs.51testing.com/viewthread.php?tid=196219 转载于:https://www.cnblogs.com/alterhu/archive/ ...

  5. sh命令 /Linux中执行shell脚本的4种方法总结

    bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限. 方法一:切换到shell脚本所在 ...

  6. oracle视图执行脚本,Sh脚本中查询Oracle v$视图时需要在$号前加转义符“\”

    DBA经常会部署一些sh脚本登陆Oracle数据库查询v$动态视图得到一些东西来实际管理自动化的目的,但在sh脚本中写ORACLE SQL语句时,如果语句查询v$视图,直接写v$XXXX是不能成功的, ...

  7. linux执行shell过程日志,Android之在linux终端执行shell脚本直接打印当前运行app的日志...

    1.问题 我们一般很多时候会需要在ubuntu终端上打印当前运行app的日志,我们一般常见的做法是 1).获取包名 打开当前运行的app,然后输入如下命令,然后在第一行TASK后面的就可以看到包名 a ...

  8. linux中的sh脚本语法

    linux中的sh脚本语法 玩linux都知道sh脚本的方便,但如何编写sh脚本却是像我这样的新手和菜鸟的难题.能不能编写得出来是一回事,了不了解又是另一回事.抱着好好学习,天天向上的精神,大家有空就 ...

  9. spark源码解析:2.2 start-daemon.sh脚本分析

    上节解析了start-master.sh脚本的内容并进行了debug:start-master.sh脚本解析,这节分析spark-daemon.sh脚本的内容并进行debug 1. spark-dae ...

最新文章

  1. NHibernate2.1新特性之entity-name
  2. 聊聊并发-Java中的Copy-On-Write容器
  3. SpringBoot运行时提示:Error starting ApplicationContexxt,To display the uto-configration report re-run you
  4. 网易2019实习生招聘题目 被3整除
  5. Linux内核升级,从2.6.18升级到3.2.14
  6. 0基础怎么学python10010基础怎么学python_0基础学python全套python教程
  7. java连接mysql执行ddl_dljd_(007_009)_jdbc执行DQL/DML/DDL语句
  8. python变量类型是动态的_【Python】python动态类型
  9. mysql write rows_解析MYSQL BINLOG 二进制格式(5)--WRITE_ROW_EVENT
  10. HTML readonly
  11. 资源放送丨《MySQL故障诊断常用方法手册》PPT视频
  12. ubuntu一键安装LAMP 及一键卸载
  13. 前端的常见的面试试题
  14. 《当程序员的那些狗日日子》(五十三)破局(中)
  15. 包子笔记 - 关于沉没成本
  16. Sql Server数据库获取月份英文简写
  17. 计算机专业该如何学习:准大一篇
  18. Android手机获取屏幕分辨率高度因虚拟导航栏带来的问题
  19. 基于FPGA的混沌系统实现
  20. xtrabackup 命令详解

热门文章

  1. 世间最美的情诗——仓央嘉措
  2. 人脸识别-闭集测试指标CMC曲线
  3. Qt通讯录(语音输入+发邮件+发短信+头像)
  4. PHP trait的使用
  5. java基础题22:(单选题)在Java中,以下描述错误的是( )
  6. 复杂场景下智能汽车目标检测心得体会
  7. 马斯克最新访谈全文,信息量极大,远见令人震撼
  8. 房企新的“生死线”:“两集中”会杀死谁?
  9. 如何跟进团队的沟通、协作和执行?这款团队协作软件你得试试
  10. 最全消费者防坑手册:走过最长的路,就是商家的套路