Ubuntu中shell脚本⽆法使⽤source命令的原因与解决⽅法
本⽂简要描述了在ubuntu系统下⽆法使⽤source命令的原因,及对应的两种解决⽅法,并在附录中引⽤⼀篇⽂章来详细解释source命
令的⽤法
问题:
由于在交叉编译时,需要在当前shell内执⾏source命令来临时指定系统的编译环境为嵌⼊式环境。故希望通过编写⼀个shell脚本来⾃
shell最简单脚本动执⾏编译命令,然⽽在脚本中通过source命令指定编译环境时,系统会提⽰不到命令
原因:
source命令是bash shell的内置命令,⽽ubuntu 默认⽤的是dash(基本POSIX标准的命令解释器),与bash的最⼤不同在于,dash遵
守POSIX标准,ubuntu在启动的时候会运⾏很多shell脚本,使⽤dash可以加快启动速度。
解决⽅法:
⽅法⼀:
在ubuntu下将shell切换回bash
ls -l /bin/sh
可以查到当前系统shell使⽤的版本
执⾏以下命令,并选择No,可以将默认的shell切换回bash
在bash下的SHELL脚本即可执⾏source命令
⽅法⼆:
在shell脚本中,将默认⽤于执⾏的脚本的程序设置为bash
#!/bin/bash
然后执⾏该脚本即可
附:
source是什么?
通知当前shell读⼊路径为filename 的⽂件并依次执⾏⽂件中的所有语句
通常⽤于重新执⾏刚修改的初始化⽂件,使之⽴即⽣效,⽽不必注销并重新登录。例如,当我们修改了/etc/profile⽂件,并想让它⽴刻⽣效,⽽不⽤重新登录,就可以使⽤source命令,如“source /etc/profile”。
source命令是bash shell的内置命令。⽽点命令(即“.”命令)则是source的另⼀名称。这两个命令都以⼀个脚本为参数,该脚本将作为当前shell的环境执⾏,即不会启动⼀个新的⼦进程。所有在脚本中设置的变量将成为当前Shell的⼀部分。
鉴于上述的描述,最简单的⼀种应⽤场景就是,进⾏交叉编译时,在当前shell内采⽤source命令临时指定系统的编译环境为嵌⼊式编
译环境,然后进⾏源码的编译和调试。⽽在别的shell内或者你关闭本shell时,⼀切⼜恢复原样。
“source filename”“sh filename”“./filename”的联系与区别
这三个命令都可以⽤于执⾏⼀个脚本⽂件
当shell脚本具有可执⾏权限时,⽤sh filename与./filename是没有区别的。./filename是因为当前⽬录没有在PATH中,所以"."是⽤来表⽰当前⽬录的。
sh filename会重新建⽴⼀个⼦shell,在⼦shell中执⾏脚本⾥⾯的语句,该⼦shell继承⽗shell的环境变量,但⼦shell是新建的,其改变的变量不会被带回⽗shell,除⾮使⽤export。
source filename读取脚本⾥⾯的语句依次在当前shell⾥⾯执⾏,没有建⽴新的⼦shell。那么脚本⾥⾯所有新建、改变变量的语句都会保存在当前shell⾥⾯。
在实践中体会
新建⼀个test.sh脚本,内容为:A=1;
修改其可执⾏权限:chmod +x test.sh;
运⾏sh test.sh后,echo $A,显⽰为空,因为A=1并未传回给当前shell;
运⾏./test.sh后,也是⼀样的效果;
运⾏source test.sh 或者 . test.sh,然后echo $A,则会显⽰1,说明A=1的变量在当前shell中;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论