1.执行报错
# 脚本具有执行权限,具体报错如下:-bash: ./test.sh: /bin/sh^M: bad interpreter: No such file or directory# 错误原因: test.sh是在window下编辑然后上传到linux系统中执行的,test.sh文件的格式为dos格式,而linux只能执行格式为unix格式的脚本# 解决方案: 1.查看文件格式,一般出问题的话格式为dos :set ff 2.设置文件格式为unix :set ff=unix或直接dos2unix test.sh# 注意问题: set ff和set fileencoding不同,前者是设置文件格式,后者是设置文件字符编码格式
2.文件乱码
1.重新以cp936的编码方式加载文件:edit ++enc=cp936# 或者采用简写:e ++enc=cp9362.重新以utf8的编码方式加载文件:edit ++enc=utf8# 或者采用简写:e ++enc=utf83.注意# 不是使用:set fileencoding=cp936或者utf8,因为那只是代表将文件保存为cp936或者utf8格式,而不是以目标格式重新加载文件
3.执行脚本的区别
# 有四种方式可以执行脚本,分别是source(.),sh,bash,./,这四种方式区别如下:1.soruce(.)在当前bash环境下读取并执行文件中的命令,该文件可以无执行权限2.sh和bash在当前bash环境下读取并执行文件中的命令,该文件可以无执行权限,但两者在执行文件时不同,是分别用自己的shell来跑文件sh使用-n选项进行shell脚本的语法检查,使用-x选项实现shell脚本逐条语句的跟踪,还可以巧妙地利用shell内置变量增强-x选项输出信息等3. ./打开一个子shell来读取并执行文件中的命令,运行一个shell脚本时会启动另一个命令解释器,每个shell脚本有效地运行在父shell(parent shell)的一个子进程里,这个父shell是指在一个控制终端或在一个xterm容器中给你命令指示符的进程.shell脚本也可以启动它自己的进程,这些子shell(子进程)使脚本并行一,有效率地同时运行脚本内的多个子任务4.结论# ./*.sh的执行方式等价于sh ./*.sh或者bash ./*.sh,此三种执行脚本的方式都是重新启动一个子shell,在子shell中执行脚本# source ./*.sh和. ./*.sh的执行方式是等价的,即都是在当前shell进程中执行脚本,而不是重新启动一个shell而在子shell进程中执行脚本(验证依据是没有被export导出的变量即非环境变量是不能被子shell继承的)
4.PATH叠加
# 手动export PATH时,某些路径在更新配置文件之后会不断地累加,虽然不影响具体使用,但是观感不好# 如下代码就会发生每次更新配置文件,不断地累加$GOROOT/bin和$GOBIN的情况:# 导出goexport GOROOT=/usr/local/goexport GOPATH=/Users/spectre/DataCentre/htdocs/goexport GOBIN=/Users/spectre/DataCentre/htdocs/go/binexport PATH=$PATH:$GOROOT/bin:$GOBIN# 做如下更改即可解决此问题:# 导出goexport GOROOT=/usr/local/goexport GOPATH=/Users/spectre/DataCentre/htdocs/goexport GOBIN=/Users/spectre/DataCentre/htdocs/go/binGOROOT_BIN="${GOROOT}/bin"if [[ $PATH != *$GOROOT_BIN* ]]then export PATH=$PATH:$GOROOT_BINfiif [[ $PATH != *$GOBIN* ]]then export PATH=$PATH:$GOBINfi