shell执行git命令

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 

制作软连接

软连接与硬链接概念

Linux软连接和硬链接

软连接相当于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,内容非常奇怪,见下图:

shell执行git命令_第1张图片
shell执行git命令_坏的解释器

使用cat -A test.sh查看test.shtest.sh能够正常运行。它的内容是:

shell执行git命令_第2张图片
shell执行git命令_正常

打开Notepad++的“显示所有字符”开关后,看到了正常脚本与异常脚本的差异:

shell执行git命令_第3张图片
shell执行git命令_正常与异常对比

产生原因

原因很长,详情见 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上执行,有两种解决方法:

  1. 写好脚本之后,借助linux的sed工具处理脚本。

  2. 用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脚本切换用户后停止执行

详情见: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

我的博客

你可能感兴趣的:(shell执行git命令)