演示環(huán)境
root@ubuntu:/bin# sudo lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04 LTS
Release: 14.04
Codename: trusty
問題現(xiàn)象?
root@ubuntu:/home/qpz/ShellCode# sh -x singleton.sh
singleton.sh: 1: singleton.sh: Syntax error: "(" unexpected
為什么會出現(xiàn)這種問題?
- 剛開始以為是我腳本本身有語法錯誤,但是打開腳本細細看了下删咱,并沒有發(fā)現(xiàn)什么錯誤
root@ubuntu:/home/qpz/ShellCode# cat singleton.sh
function keep_singleton()
{
local tmpfile="/tmp/cus_log_report$$"
cat $tmpfile
}
keep_singleton
- 于是我查看了系統(tǒng)的/bin/sh默認指向什么,如下:
root@ubuntu:/bin# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Sep 11 00:39 /bin/sh -> dash
- 這是我非常奇怪這個dash是個什么東西蛮艰?于是我翻閱了一下書籍腋腮,查找dash是什么,并且總結(jié)了他們之間的不同壤蚜,如下:
dash的前身是ash,有人把 ash 從 NetBSD 移植到 Linux 并更名為 dash (Debian Almquist Shell)即寡,并建議將 /bin/sh 指向它,以獲得更快的腳本執(zhí)行速度袜刷。Dash Shell 比 Bash Shell 小的多聪富,符合POSIX標準。
- 為什么在dash下會報語法錯誤著蟹?
- bash: function在bash中為關(guān)鍵字
- dash: dash中沒有function這個關(guān)鍵字
如何解決墩蔓?
- 執(zhí)行dpkg-reconfigure dash
root@ubuntu:/home/qpz/ShellCode# sudo dpkg-reconfigure dash
Removing 'diversion of /bin/sh to /bin/sh.distrib by dash'
Adding 'diversion of /bin/sh to /bin/sh.distrib by bash'
Removing 'diversion of /usr/share/man/man1/sh.1.gz to /usr/share/man/man1/sh.distrib.1.gz by dash'
Adding 'diversion of /usr/share/man/man1/sh.1.gz to /usr/share/man/man1/sh.distrib.1.gz by bash'
- 彈出一個窗口,選擇No
- 驗證是否修改成功?
root@ubuntu:/bin# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Sep 11 00:39 /bin/sh -> bash
- 重新運行腳本
root@ubuntu:/home/qpz/ShellCode# sh -x singleton.sh
+ keep_singleton
+ local tmpfile=/tmp/cus_log_report5968
+ cat /tmp/cus_log_report5968
cat: /tmp/cus_log_report5968: No such file or directory
End.