let commmand was not found in bash?

要解决问题,首先要遇到问题.

在bash中运行下面一段代码:

#!/bin/bash
#spawn.sh
PIDS=$(pidof sh $0)
P_array=($PIDS)
echo $PIDS
let "instances=${#P_array[*]} - 1"
echo "$instances instance(s) of this script running."
echo "[Hit Ctl-C to exit.]"; echo
sleep 1
sh $0
exit 0

你会得到什么?

运行错误?let命令找不到了? OK, 反正是运行不了, 当然, 除了第一句.

这是在高级bash脚本编程指南中的一个例子,但是在我的ubuntu中却报错了,为什么?

搜索了一下,发现这个let是bash的内建命令,什么意思呢?就是只有bash有这个命令,而sh, dash, 都没有这个命令.

如果想知道你电脑中到底有什么shell,可以通过

cat /etc/shells

这个命令来得知.

# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/bin/ksh93
/usr/bin/screen

但是我们在脚本第一行已经写明了要用bash运行啊,为什么还不可以?

Ok,请问,你运行的方式是什么呢? sh script.sh ? 这样还是用sh运行呀,而且Ubuntu中sh默认关联的shell是dash,并不是bash.所以才会出现 let command not found 这种情况.

(PS:最关键的一句! 倒数第二行! 脚本用了sh来运行自身, 所以才会在第二次循环运行时出现错误! 如果改为

bash $0

就没问题了.如果你也像我一样正好看到这一部分,那么聪明的你,明白为什么出错了嘛?)

如果不信,你可以直接这样:

bash script.sh

是不是成功运行了呢?但是每次都要这样真的很麻烦,有没有什么别的办法呢?当然是有的.

  1. alias
    alias sh='bash’ 这会是一个方法,但并不是长久的方法.如果想要从根本上取消sh与dash的关联,还需要….

  2. 这样
    sudo dpkg-reconfigure dash
    然后选择 NO 这样当你运行sh的时候就会用bash来运行了.并且系统中所有的shell运行方式都会改成bash,而不是dash.

ATTENTAIN 这样修改将会影响到系统的启动速度,甚至会影响到一些依赖于dash独有特性的脚本(这些特性bash没有提供),使整个系统都使用bash运行脚本! 慎用!

3.最简单的方法(Recommended),在文件开头处写明用bash, 并且将里面的sh全都换成bash.

#!/bin/bash

然后运行脚本的时候添加可执行权限

$./script.sh

,或者

$bash script.sh

下面是wiki时间~

我来搬运一下各种shell的区别~

sh

sh其实是一个连接符号

mr@ubuntu:~$ l /bin -h | grep sh
-rwxr-xr-x 1 root root 1.5M Jan  9  2013 ksh93
-rwxr-xr-x 1 root root 119K Feb 19  2014 dash
lrwxrwxrwx 1 root root    4 Oct  7  2014 sh.distrib -> dash
lrwxrwxrwx 1 root root    7 Oct  7  2014 static-sh -> busybox
lrwxrwxrwx 1 root root    4 Oct  8  2014 rbash -> bash
-rwxr-xr-x 1 root root 998K Oct  8  2014 bash
lrwxrwxrwx 1 root root   21 Feb 12 18:57 ksh -> /etc/alternatives/ksh
lrwxrwxrwx 1 root root    4 Apr 11 15:05 sh -> dash

sh指向bash或者dash. 系统运行时需要启动各种脚本,默认就使用sh运行的, 根据Ubuntu系统的设定, sh 就是dash.

dash

自Ubuntu 6.10以后,系统的默认shell /bin/sh被改成了dash。dash(the Debian Almquist shell)是一个比bash小很多但仍兼容POSIX标准的shell,它占用的磁盘空间更少,执行shell脚本比bash更快,依赖的库文件更少,当然,在功能上无法与bash相比。dash来自于NetBSD版本的Almquist Shell(ash)。

dash shell是作为Debian Linux发行版的一部分开发的,主要出现在Ubuntu Linux发行版中。它是Bourne shell的精简版,支持的功能不像bash shell支持的那样多,这可能会给脚本编程带来一些问题。

Ubuntu中将默认shell改为dash的主要原因是效率。由于Ubuntu启动过程中需要启动大量的shell脚本,为了优化启动速度和资源使用情况,Ubuntu做了这样的改动。

bash

bash shell是几乎所有Linux发行版的默认shell。作为标准Unix shell——Bourne shell(沿用创建者的名字)的替代,bash shell由GNU工程开发。bash shell的名称就是针对这个Bourne shell的文字游戏,全称为“Bourne again shell”。 bash有很灵活和强大的编程接口,同时又有很友好的用户界面。功能包括命令补齐、通配符、命令历史记录、别名等。

参考资料:

http://www.51testing.com/html/82/138282-216130.html

http://www.ituring.com.cn/article/1826

http://blog.chinaunix.net/uid-27037833-id-3431985.html

comments powered by Disqus