1.执行报错

  1. # 脚本具有执行权限,具体报错如下:
  2. -bash: ./test.sh: /bin/sh^M: bad interpreter: No such file or directory
  3. # 错误原因:
  4. test.sh是在window下编辑然后上传到linux系统中执行的,test.sh文件的格式为dos格式,而linux只能执行格式为unix格式的脚本
  5. # 解决方案:
  6. 1.查看文件格式,一般出问题的话格式为dos
  7. :set ff
  8. 2.设置文件格式为unix
  9. :set ff=unix或直接dos2unix test.sh
  10. # 注意问题:
  11. set ffset fileencoding不同,前者是设置文件格式,后者是设置文件字符编码格式

2.文件乱码

  1. 1.重新以cp936的编码方式加载文件
  2. :edit ++enc=cp936
  3. # 或者采用简写
  4. :e ++enc=cp936
  5. 2.重新以utf8的编码方式加载文件
  6. :edit ++enc=utf8
  7. # 或者采用简写
  8. :e ++enc=utf8
  9. 3.注意
  10. # 不是使用:set fileencoding=cp936或者utf8,因为那只是代表将文件保存为cp936或者utf8格式,而不是以目标格式重新加载文件

3.执行脚本的区别

  1. # 有四种方式可以执行脚本,分别是source(.),sh,bash,./,这四种方式区别如下:
  2. 1.soruce(.)
  3. 在当前bash环境下读取并执行文件中的命令,该文件可以无执行权限
  4. 2.shbash
  5. 在当前bash环境下读取并执行文件中的命令,该文件可以无执行权限,但两者在执行文件时不同,是分别用自己的shell来跑文件
  6. sh使用-n选项进行shell脚本的语法检查,使用-x选项实现shell脚本逐条语句的跟踪,还可以巧妙地利用shell内置变量增强-x选项输出信息等
  7. 3. ./
  8. 打开一个子shell来读取并执行文件中的命令,运行一个shell脚本时会启动另一个命令解释器,每个shell脚本有效地运行在父shell(parent shell)的一个子进程里,这个父shell是指在一个控制终端或在一个xterm容器中给你命令指示符的进程.shell脚本也可以启动它自己的进程,这些子shell(子进程)使脚本并行一,有效率地同时运行脚本内的多个子任务
  9. 4.结论
  10. # ./*.sh的执行方式等价于sh ./*.sh或者bash ./*.sh,此三种执行脚本的方式都是重新启动一个子shell,在子shell中执行脚本
  11. # source ./*.sh和. ./*.sh的执行方式是等价的,即都是在当前shell进程中执行脚本,而不是重新启动一个shell而在子shell进程中执行脚本(验证依据是没有被export导出的变量即非环境变量是不能被子shell继承的)

4.PATH叠加

  1. # 手动export PATH时,某些路径在更新配置文件之后会不断地累加,虽然不影响具体使用,但是观感不好
  2. # 如下代码就会发生每次更新配置文件,不断地累加$GOROOT/bin和$GOBIN的情况:
  3. # 导出go
  4. export GOROOT=/usr/local/go
  5. export GOPATH=/Users/spectre/DataCentre/htdocs/go
  6. export GOBIN=/Users/spectre/DataCentre/htdocs/go/bin
  7. export PATH=$PATH:$GOROOT/bin:$GOBIN
  8. # 做如下更改即可解决此问题:
  9. # 导出go
  10. export GOROOT=/usr/local/go
  11. export GOPATH=/Users/spectre/DataCentre/htdocs/go
  12. export GOBIN=/Users/spectre/DataCentre/htdocs/go/bin
  13. GOROOT_BIN="${GOROOT}/bin"
  14. if [[ $PATH != *$GOROOT_BIN* ]]
  15. then
  16. export PATH=$PATH:$GOROOT_BIN
  17. fi
  18. if [[ $PATH != *$GOBIN* ]]
  19. then
  20. export PATH=$PATH:$GOBIN
  21. fi