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=cp936
2.重新以utf8的编码方式加载文件
:edit ++enc=utf8
# 或者采用简写
:e ++enc=utf8
3.注意
# 不是使用: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的情况:
# 导出go
export GOROOT=/usr/local/go
export GOPATH=/Users/spectre/DataCentre/htdocs/go
export GOBIN=/Users/spectre/DataCentre/htdocs/go/bin
export PATH=$PATH:$GOROOT/bin:$GOBIN
# 做如下更改即可解决此问题:
# 导出go
export GOROOT=/usr/local/go
export GOPATH=/Users/spectre/DataCentre/htdocs/go
export GOBIN=/Users/spectre/DataCentre/htdocs/go/bin
GOROOT_BIN="${GOROOT}/bin"
if [[ $PATH != *$GOROOT_BIN* ]]
then
export PATH=$PATH:$GOROOT_BIN
fi
if [[ $PATH != *$GOBIN* ]]
then
export PATH=$PATH:$GOBIN
fi