脚本执行的方式 作者: morningp 时间: 2020-09-14 分类: shell相关 起因是这样的,今天打算在生产环境(RHEL)上写一个脚本,于是先在测试环境(Debian)里进行脚本的测试,但是写好脚本后while循环的地方总是报错,于是一番搜索了解到了这方面的斜街只是,在这里记录一下防止自己忘记。 - shebang 我们平时编写shell脚本时,第一行的`#!/bin/bash`这个东西其实就是shebang,这句话由#开头,但是并不是注释,而是指定脚本的解释器,在**没有显式指定脚本解释器**的时候,就由你指定的这个解释器来解释脚本执行,所以我们一般执行脚本使用./xxx.sh,这里使用的方式就是没有显式指定脚本解释器,使用了指定的bash来解释执行脚本。 - 执行脚本的几种方式: 1:./xxx.sh:这种方式是比较普遍的一种方式,很多人都喜欢这样执行,在制定了默认解释器的情况下,这种方式也是最方便可靠的。 2: sh方式:这种方式是显示制定了脚本解释器的方式,默认的大多数linux发行版上,/bin/sh都是软连接了/bin/bash,可以通过`ls -la /bin/sh`来查看,而恰巧,Debian的/bin/sh软连接的是/bin/dash。所以导致了while循环的地方报错。 执行脚本的方式大概就是这些,另外还有一些source之类的方式,以及几种不同方式涉及到的进程问题,这里就不再展开了。 - dash和bash的差别 shell作为一种脚本语言,拥有那么多的解释器,自然也是有其一套标准的:POSIX(Portable Operating System Interface),这是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945。而事实上bash并没有严格遵循POSIX标准,所以Debian才选择了严格遵守POSIX语法标准的dash来作为其sh的软连接,而在dash中,是不支持双括号的比较大小(会把<和>认成重定向符号),也不支持C语言风格的for循环的。此外还有十多种的区别。 最后,解决的方法也很简单,在debian下只需要执行`dpkg-reconfigure dash`,选择no,就可以了。当然也可以指定bash解释器并且使用./xxx.sh的方式执行脚。 标签: none