shell执行git命令
发布代码的git命令
发布博客代码到vps上,按顺序执行下面的git命令:
git pull origin test
git push origin master
在已经记住了这两个git命令的情况下,没有必要每次发布
都敲这么多代码。我需要一个shell脚本,一次性执行多条
命令。
删除缓存的linux命令
由于我把每篇文章数据都存储到了文件缓存中,每次编辑
旧文章重新发布后,并不能看到最新数据,需要到服务器
上手工清理缓存。这也很麻烦。
删除缓存的linux命令是:
rm -rvf /usr/local/nginx/html/blog/runtime/cache
编写shell脚本
#! /bin/bash
# 保存当前目录
currentDir=$PWD
echo "Start to publish...\n"
# 切换到项目目录
cd /usr/local/nginx/html/blog
# 执行git命令
git pull origin test
git push origin master
# 切换回原来的目录
cd $currentDir
# 删除缓存
rm -rvf /usr/local/nginx/html/blog/runtime/cache
echo "Success\n";
执行脚本
假设写好的脚本文件名为git.sh
,若直接运行该脚本,会提示
无权限。那就必须让执行脚本的用户具有执行这个脚本的权限,
使用命令:
chmod +x ./test.sh #使脚本具有执行权限
以后每次发布项目的时候,直接使用执行脚本就可以了。
./git.sh
制作软连接
软连接与硬链接概念
软连接相当于windows里的快捷方式,删除它之后,原文件依然存在。
一个文件,有多个硬链接与其对应。只有将该文件的所有硬链接删除
之后,该文件才会被删除。
软连接与硬链接命令
待补充。
遇到的问题
error: 无法打开 .git/FETCH_HEAD:????
使用cg帐号执行git.sh
的时候,出现这个错误提示。切换到root
帐号,su root
后,可以执行这个脚本了。
坏的解释器: 没有那个文件或目录
错误现象
执行下面的脚本:
#! /bin/bash
# 保存当前目录
currentDir=$PWD
echo "Start to publish...\n"
# 切换到项目目录
cd /usr/local/nginx/html/blog
# 执行git命令
git pull origin test
git push origin master
# 切换回原来的目录
cd $currentDir
# 删除缓存
rm -rvf /usr/local/nginx/html/blog/runtime/cache
echo "Success\n";
控制台出现错误信息:
[root@localhost shell]# ./git.sh
bash: ./git.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
用命令cat -A git.sh
查看git.sh
,内容非常奇怪,见下图:
使用cat -A test.sh
查看test.sh
,test.sh
能够正常运行。它的内容是:
打开Notepad++的“显示所有字符”开关后,看到了正常脚本与异常脚本的差异:
产生原因
原因很长,详情见 Linux和windows中的换行符差异问题。
我只掌握这些:Unix系统里,每行结尾只有“<换行>”,即“\n”;Windows系统
里面,每行结尾是“<换行><回车>”,即“\n\r”;Mac系统里,每行结尾是“<回车>”。
一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成
一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号
windows创建的文件是 \n\r结束的, 而linux,mac这种unix类系统是\n结束的。
解决办法
编程工作几乎全在windows上做,在windows上写出来的shell脚本因换行问题
不能在linux上执行,有两种解决方法:
写好脚本之后,借助linux的sed工具处理脚本。
用PHP写个文本处理工具,在linux上运行脚本之前,先用PHP工具处理好
shell脚本的换行问题。
先尝试一些第一种,在linux上执行命令
sed -i 's/\r$//'git.sh
-i
表示插入,'s'表示替代模式,\r$
表示任何以\r
结尾的字符。整句的意思是,
把\r
结尾的字符替换成空白。(不理解)
执行上述命令,屏幕打印报错信息:
[root@localhost shell]# sed -i 's/\r$//'git.sh
sed:-e 表达式 #1,字符 10:“s”的未知选项
使用下面的命令:
sed -i 's/\r$//' git.sh
没有任何输出信息。再使用cat -A git.sh
查看,发现已经正常了。用sz
命令把
git.sh
下载到windows上用notepad++查看,也是正常的。
正确的sed
代码与错误的sed
代码仅有的差异是:
sed -i 's/\r$//'git.sh
sed -i 's/\r$//' git.sh
git.sh
是否与前面有空格。
还有一个发现:若一个文件的换行符是\r
,那么即使在windows下通过回车键
换行,换行符也是\n
。可以保留一份以\n
为换行符的shell脚本模板,每次新建
shell脚本的时候,都用它。
shell脚本切换用户后停止执行
其他知识
批量删除文件
下面的命令删除了所有的txt文件,包括当前目录的下级目录!
find . -name "*.txt" -type f | xargs -n 1 rm -f
或
find . -name "*.txt" -type f | xargs -n 1 rm
git查看远程仓库地址
git remote -v