diff --git a/docs/docker/docker-quickstart.md b/docs/docker/docker-quickstart.md index e88355c..03c5633 100644 --- a/docs/docker/docker-quickstart.md +++ b/docs/docker/docker-quickstart.md @@ -24,7 +24,7 @@ docker image pull hello-world (2)查看镜像 -```sh +```bash ~ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 4ab4c602aa5e 3 months ago 1.84kB diff --git a/docs/kubernetes/kubernetes.md b/docs/kubernetes/kubernetes.md index dd20fcb..7649251 100644 --- a/docs/kubernetes/kubernetes.md +++ b/docs/kubernetes/kubernetes.md @@ -62,7 +62,7 @@ Kubernetes 包含若干抽象用来表示系统状态,包括:已部署的容 ### 客户端配置 -```sh +```bash # Setup autocomplete in bash; bash-completion package should be installed first source <(kubectl completion bash) @@ -78,7 +78,7 @@ kubectl config set-credentials kubeuser/foo.kubernetes.com --username=kubeuser - ### 查找资源 -```sh +```bash # List all services in the namespace kubectl get services @@ -112,7 +112,7 @@ for i in 0 1; do kubectl exec foo-$i -- sh -c 'echo $(hostname) > /usr/share/ngi ### 资源管理 -```sh +```bash # Get documentation for pod or service kubectl explain pods,svc @@ -143,7 +143,7 @@ kubectl delete -f ./my-manifest.yaml ### 监控和日志 -```sh +```bash # Deploy Heapster from Github repository kubectl create -f deploy/kube-config/standalone/ diff --git a/docs/lang/shell.md b/docs/lang/shell.md index 866f4ff..43cfd6c 100644 --- a/docs/lang/shell.md +++ b/docs/lang/shell.md @@ -107,7 +107,7 @@ Shell 的解释器种类众多,常见的有: - 指定 sh 解释器 -```sh +```bash #!/bin/sh ``` diff --git a/docs/linux/cli/01.查看Linux命令帮助信息.md b/docs/linux/cli/01.查看Linux命令帮助信息.md index 2e95afe..fc8c92b 100644 --- a/docs/linux/cli/01.查看Linux命令帮助信息.md +++ b/docs/linux/cli/01.查看Linux命令帮助信息.md @@ -59,7 +59,7 @@ tags: 示例: -```sh +```bash # 查看 man 命令的简要说明 $ whatis man @@ -75,7 +75,7 @@ $ whatis -w "loca*" 示例: -```sh +```bash # 查看 man 命令的详细说明 $ info man ``` @@ -88,13 +88,13 @@ $ info man 示例: -```sh +```bash which pwd # 查找命令的路径 ``` 说明:which 是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档的!所以,不同的 PATH 配置内容所找到的命令当然不一样的! -```sh +```bash [root@localhost ~]# which cd cd: shell built-in command ``` @@ -111,7 +111,7 @@ cd 这个常用的命令竟然找不到啊!为什么呢?这是因为 cd 是 示例: -```sh +```bash whereis git # 将相关的文件都查找出来 ``` @@ -123,7 +123,7 @@ whereis git # 将相关的文件都查找出来 示例: -```sh +```bash $ man date # 查看 date 命令的帮助手册 $ man 3 printf # 查看 printf 命令的帮助手册中的第 3 类 $ man -k keyword # 根据命令中部分关键字来查询命令 @@ -149,7 +149,7 @@ man 页面的分类(常用的是分类 1 和分类 3): 前面说到使用 whatis 会显示命令所在的具体的文档类别,我们学习如何使用它 -```sh +```bash $ whatis printf printf (1) - format and print data printf (1p) - write formatted output @@ -160,7 +160,7 @@ printf [builtins](1) - bash built-in commands, see bash(1) 我们看到 printf 在分类 1 和分类 3 中都有;分类 1 中的页面是命令操作及可执行文件的帮助;而 3 是常用函数库说明;如果我们想看的是 C 语言中 printf 的用法,可以指定查看分类 3 的帮助: -```sh +```bash $ man 3 printf ``` diff --git a/docs/linux/cli/02.Linux文件目录管理.md b/docs/linux/cli/02.Linux文件目录管理.md index 0a7dd2f..d97deb7 100644 --- a/docs/linux/cli/02.Linux文件目录管理.md +++ b/docs/linux/cli/02.Linux文件目录管理.md @@ -57,7 +57,7 @@ linux 目录结构是树形结构,其根目录是 `/` 。一张思维导图说 Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。 在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组,如: -```sh +```bash $ ls -l total 64 dr-xr-xr-x 2 root root 4096 Dec 14 2012 bin @@ -91,7 +91,7 @@ dr-xr-xr-x 4 root root 4096 Apr 19 2012 boot #### Linux 文件属主和属组 -```sh +```bash $ ls -l total 64 dr-xr-xr-x 2 root root 4096 Dec 14 2012 bin @@ -146,7 +146,7 @@ dr-xr-xr-x 4 root root 4096 Apr 19 2012 boot 示例: -```sh +```bash cd # 切换到用户主目录 cd ~ # 切换到用户主目录 cd - # 切换到上一个工作目录 @@ -162,7 +162,7 @@ cd ../.. # 切换到上两级目录 示例: -```sh +```bash ls # 列出当前目录可见文件 ls -l # 列出当前目录可见文件详细信息 ls -la # 列出所有文件(包括隐藏)的详细信息 @@ -186,7 +186,7 @@ ls --color=auto # 列出文件并标记颜色分类 示例: -```sh +```bash # 在当前目录中创建 zp 和 zp 的子目录 test mkdir -p zp/test @@ -202,7 +202,7 @@ mkdir -p -m 750 zp/test 示例: -```sh +```bash # 删除子目录 test 和其父目录 zp rmdir -p zp/test ``` @@ -215,7 +215,7 @@ rmdir -p zp/test 示例: -```sh +```bash # 列出目录 /private 第一级文件名 tree /private -L 1 /private/ @@ -256,7 +256,7 @@ touch ex2 示例: -```sh +```bash # 将目录 /usr/mengqc/mub1 下的文件 m2.c 链接到目录 /usr/liu 下的文件 a2.c cd /usr/mengqc ln /mub1/m2.c /usr/liu/a2.c @@ -274,7 +274,7 @@ ln -s /usr/mengqc/mub1 /usr/liu/abc 示例: -```sh +```bash # 将 main1.c 重命名为 main.c rename main1.c main.c main1.c @@ -292,7 +292,7 @@ rename "s//.txt//" * # 把所有以 .txt 结尾的文件名的.txt 示例: -```sh +```bash stat myfile ``` @@ -304,7 +304,7 @@ stat myfile 示例: -```sh +```bash file install.log # 显示文件类型 file -b install.log # 不显示文件名称 file -i install.log # 显示 MIME 类型 @@ -340,7 +340,7 @@ x=执行属性  //值= 1 示例: -```sh +```bash chmod u+x,g+w f01  # 为文件f01设置自己可以执行,组员可以写入的权限 chmod u=rwx,g=rw,o=r f01 chmod 764 f01 @@ -360,7 +360,7 @@ chmod -R 755 /home/wwwroot/* 示例: -```sh +```bash # 将目录/usr/meng及其下面的所有文件、子目录的文件主改成 liu chown -R liu /usr/meng ``` @@ -375,7 +375,7 @@ chown -R liu /usr/meng 示例: -```sh +```bash locate pwd # 查找和 pwd 相关的所有文件 locate /etc/sh # 搜索 etc 目录下所有以 sh 开头的文件 ``` @@ -386,7 +386,7 @@ locate /etc/sh # 搜索 etc 目录下所有以 sh 开头的文件 > > 参考:http://man.linuxde.net/find -```sh +```bash # 当前目录搜索所有文件,文件内容 包含 “140.206.111.111” 的内容 find . -type f -name "*" | xargs grep "140.206.111.111" @@ -428,7 +428,7 @@ find /home ! -name "*.txt" 示例: -```sh +```bash # 将文件 file 复制到目录 /usr/men/tmp 下,并改名为 file1 cp file /usr/men/tmp/file1 @@ -485,7 +485,7 @@ rm ~/.ssh/id_rsa.pub.tmp 示例: -```sh +```bash mv file1.txt /home/office/ # 移动单个文件 mv file2.txt file3.txt file4.txt /home/office/ # 移动多个文件 mv *.txt /home/office/ # 移动所有 txt 文件 @@ -509,7 +509,7 @@ mv -bv *.txt /home/office # 复制时创建备份 > > 参考:http://man.linuxde.net/rm -```sh +```bash rm test.txt # 删除文件 rm -i test.txt test2.txt # 交互式删除文件 rm -r * # 删除当前目录下的所有文件和目录 diff --git a/docs/linux/cli/03.Linux文件内容查看编辑.md b/docs/linux/cli/03.Linux文件内容查看编辑.md index f0fac7a..63590d8 100644 --- a/docs/linux/cli/03.Linux文件内容查看编辑.md +++ b/docs/linux/cli/03.Linux文件内容查看编辑.md @@ -49,7 +49,7 @@ tags: 示例: -```sh +```bash cat m1 # 在屏幕上显示文件 ml 的内容 cat m1 m2 # 同时显示文件 ml 和 m2 的内容 cat m1 m2 > file # 将文件 ml 和 m2 合并后放入文件 file 中 @@ -69,7 +69,7 @@ cat m1 m2 > file # 将文件 ml 和 m2 合并后放入文件 file 中 示例: -```sh +```bash tail file # 显示文件file的最后10行 tail -n +20 file # 显示文件file的内容,从第20行至文件末尾 tail -c 10 file # 显示文件file的最后10个字符 @@ -92,7 +92,7 @@ tail -c 10 file # 显示文件file的最后10个字符 示例: -```sh +```bash # 显示文件 file 的内容,但在显示之前先清屏,并且在屏幕的最下方显示完核的百分比。 more -dc file @@ -106,7 +106,7 @@ less 命令的作用与 more 十分相似,都可以用来浏览文字档案的 示例: -```sh +```bash less /var/log/shadowsocks.log ``` @@ -118,7 +118,7 @@ less /var/log/shadowsocks.log 示例: -```sh +```bash # 替换文本中的字符串 sed 's/book/books/' file @@ -163,7 +163,7 @@ sed '/^test/'d file 示例: -```sh +```bash # 在多级目录中对文本递归搜索(程序员搜代码的最爱): $ grep "class" . -R -n diff --git a/docs/linux/cli/04.Linux文件压缩和解压.md b/docs/linux/cli/04.Linux文件压缩和解压.md index db5c0e8..d4c21dc 100644 --- a/docs/linux/cli/04.Linux文件压缩和解压.md +++ b/docs/linux/cli/04.Linux文件压缩和解压.md @@ -39,7 +39,7 @@ tags: 示例: -```sh +```bash tar -cvf log.tar log2012.log # 仅打包,不压缩 tar -zcvf log.tar.gz log2012.log # 打包后,以 gzip 压缩 tar -jcvf log.tar.bz2 log2012.log # 打包后,以 bzip2 压缩 @@ -59,7 +59,7 @@ tar -zxvf log30.tar.gz log2013.log # 只将 tar 内的部分文件解压出 示例: -```sh +```bash gzip * # 将所有文件压缩成 .gz 文件 gzip -l * # 详细显示压缩文件的信息,并不解压 gzip -dv * # 解压上例中的所有压缩文件,并列出详细的信息 @@ -76,7 +76,7 @@ gzip -dr test/ # 递归地解压目录 示例: -```sh +```bash # 将 /home/Blinux/html/ 这个目录下所有文件和文件夹打包为当前目录下的 html.zip zip -q -r html.zip /home/Blinux/html ``` @@ -89,7 +89,7 @@ zip -q -r html.zip /home/Blinux/html 示例: -```sh +```bash unzip test.zip # 解压 zip 文件 unzip -n test.zip -d /tmp/ # 在指定目录下解压缩 unzip -o test.zip -d /tmp/ # 在指定目录下解压缩,如果有相同文件存在则覆盖 diff --git a/docs/linux/cli/05.Linux用户管理.md b/docs/linux/cli/05.Linux用户管理.md index c6422ba..a3d53c7 100644 --- a/docs/linux/cli/05.Linux用户管理.md +++ b/docs/linux/cli/05.Linux用户管理.md @@ -50,7 +50,7 @@ tags: 示例: -```sh +```bash # 建立一个新组,并设置组 ID 加入系统 $ groupadd -g 344 jsdigname ``` @@ -63,7 +63,7 @@ $ groupadd -g 344 jsdigname 示例: -```sh +```bash $ groupadd damon # 创建damon用户组 $ groupdel damon # 删除这个用户组 ``` @@ -82,7 +82,7 @@ $ groupdel damon # 删除这个用户组 示例: -```sh +```bash # 新建用户加入组 $ useradd –g sales jack –G company,employees # -g:加入主要组、-G:加入次要组 @@ -100,7 +100,7 @@ $ useradd caojh -u 544 userdel 命令很简单,比如我们现在有个用户 linuxde,其 home 目录位于`/var`目录中,现在我们来删除这个用户: -```sh +```bash $ userdel linuxde # 删除用户linuxde,但不删除其家目录及文件; $ userdel -r linuxde # 删除用户linuxde,其 home 目录及文件一并删除; ``` @@ -113,7 +113,7 @@ $ userdel -r linuxde # 删除用户linuxde,其 home 目录及文件一并 示例: -```sh +```bash # 将 newuser2 添加到组 staff 中 $ usermod -G staff newuser2 @@ -135,7 +135,7 @@ $ usermod -U newuser1 示例: -```sh +```bash # 如果是普通用户执行 passwd 只能修改自己的密码。 # 如果新建用户后,要为新用户创建密码,则用 passwd 用户名,注意要以 root 用户的权限来创建。 $ passwd linuxde # 更改或创建linuxde用户的密码; @@ -180,7 +180,7 @@ Empty password. # 空密码,也就是没有密码; 示例: -```sh +```bash # 变更帐号为 root 并在执行 ls 指令后退出变回原使用者: $ su -c ls root @@ -199,7 +199,7 @@ $ su -test 示例: -```sh +```bash # 指定用户执行命令 $ sudo -u userb ls -l # 列出目前的权限 diff --git a/docs/linux/cli/06.Linux系统管理.md b/docs/linux/cli/06.Linux系统管理.md index e995301..c1f13be 100644 --- a/docs/linux/cli/06.Linux系统管理.md +++ b/docs/linux/cli/06.Linux系统管理.md @@ -68,7 +68,7 @@ lsb_release 不是 bash 默认命令,如果要使用,需要先安装。 示例: -```sh +```bash reboot # 重开机。 reboot -w # 做个重开机的模拟(只有纪录并不会真的重开机)。 ``` @@ -81,7 +81,7 @@ reboot -w # 做个重开机的模拟(只有纪录并不会真的重开机 示例: -```sh +```bash # 退出当前 shell [root@localhost ~]# exit logout @@ -114,7 +114,7 @@ fi 示例: -```sh +```bash # 指定现在立即关机 shutdown -h now @@ -130,7 +130,7 @@ shutdown +5 "System will shutdown after 5 minutes" 示例: -```sh +```bash # 格式化输出 date +"%Y-%m-%d" 2009-12-07 @@ -196,7 +196,7 @@ echo $difference seconds. 示例: -```sh +```bash # 将 /dev/hda1 挂在 /mnt 之下 mount /dev/hda1 /mnt @@ -216,7 +216,7 @@ mount -o loop /tmp/image.iso /mnt/cdrom 示例: -```sh +```bash # 通过设备名卸载 umount -v /dev/sda1 /dev/sda1 umounted @@ -234,7 +234,7 @@ umount -v /mnt/mymount/ 示例: -```sh +```bash # 按内存资源的使用量对进程进行排序 ps aux | sort -rnk 4 @@ -250,7 +250,7 @@ ps aux | sort -nk 3 示例: -```sh +```bash # 列出所有信号名称 kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL @@ -288,7 +288,7 @@ kill 3268 示例: -```sh +```bash # 1.启动 nfs 服务 systemctl start nfs-server.service @@ -324,7 +324,7 @@ sudo systemctl disable firewalld.service 示例: -```sh +```bash service network status 配置设备: lo eth0 @@ -347,7 +347,7 @@ service network restart 示例: -```sh +```bash # 每 1 分钟执行一次 command * * * * * command diff --git a/docs/linux/cli/07.Linux网络管理.md b/docs/linux/cli/07.Linux网络管理.md index f457e63..e95e91f 100644 --- a/docs/linux/cli/07.Linux网络管理.md +++ b/docs/linux/cli/07.Linux网络管理.md @@ -64,7 +64,7 @@ tags: 示例: -```sh +```bash # 下载文件 $ curl http://man.linuxde.net/text.iso --silent @@ -81,7 +81,7 @@ $ curl http://man.linuxde.net/test.iso -o filename.iso --progress 示例: -```sh +```bash # 使用 wget 下载单个文件 $ wget http://www.linuxde.net/testfile.zip ``` @@ -94,7 +94,7 @@ $ wget http://www.linuxde.net/testfile.zip 示例: -```sh +```bash telnet 192.168.2.10 Trying 192.168.2.10... Connected to 192.168.2.10 (192.168.2.10). @@ -115,7 +115,7 @@ Login incorrect 示例: -```sh +```bash $ ip link show # 查看网络接口信息 $ ip link set eth0 upi # 开启网卡 $ ip link set eth0 down # 关闭网卡 @@ -145,7 +145,7 @@ $ ip route delete 192.168.1.0/24 dev eth0 # 删除路由 示例: -```sh +```bash $ hostname AY1307311912260196fcZ ``` @@ -158,7 +158,7 @@ AY1307311912260196fcZ 示例: -```sh +```bash # 查看网络设备信息(激活状态的) [root@localhost ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:16:3E:00:1E:51 @@ -186,7 +186,7 @@ lo Link encap:Local Loopback 示例: -```sh +```bash # 查看当前路由 route Kernel IP routing table @@ -284,7 +284,7 @@ systemctl 是 CentOS7 的服务管理工具中主要的工具,它融合之前 示例: -```sh +```bash # 开放指定的端口 iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行 @@ -328,7 +328,7 @@ Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes) 示例: -```sh +```bash [root@localhost ~]# host www.jsdig.com www.jsdig.com is an alias for host.1.jsdig.com. host.1.jsdig.com has address 100.42.212.8 @@ -355,7 +355,7 @@ Received 54 bytes from 202.96.104.15#53 in 0 ms 示例: -```sh +```bash [root@localhost ~]# nslookup www.jsdig.com Server: 202.96.104.15 Address: 202.96.104.15#53 @@ -374,7 +374,7 @@ Address: 100.42.212.8 示例: -```sh +```bash # TCP 端口扫描 [root@localhost ~]# nc -v -z -w2 192.168.0.3 1-100 192.168.0.3: inverse host lookup failed: Unknown host @@ -394,7 +394,7 @@ Address: 100.42.212.8 示例: -```sh +```bash [root@AY1307311912260196fcZ ~]# ping www.jsdig.com PING host.1.jsdig.com (100.42.212.8) 56(84) bytes of data. 64 bytes from 100-42-212-8.static.webnx.com (100.42.212.8): icmp_seq=1 ttl=50 time=177 ms @@ -416,7 +416,7 @@ rtt min/avg/max/mdev = 174.068/176.916/178.182/1.683 ms 示例: -```sh +```bash traceroute www.58.com traceroute to www.58.com (211.151.111.30), 30 hops max, 40 byte packets 1 unknown (192.168.2.1) 3.453 ms 3.801 ms 3.937 ms @@ -441,7 +441,7 @@ traceroute to www.58.com (211.151.111.30), 30 hops max, 40 byte packets 示例: -```sh +```bash # 列出所有端口 (包括监听和未监听的) netstat -a #列出所有端口 netstat -at #列出所有tcp端口 diff --git a/docs/linux/cli/08.Linux硬件管理.md b/docs/linux/cli/08.Linux硬件管理.md index 5e55376..3d5c6ef 100644 --- a/docs/linux/cli/08.Linux硬件管理.md +++ b/docs/linux/cli/08.Linux硬件管理.md @@ -42,7 +42,7 @@ tags: 示例: -```sh +```bash # 查看系统磁盘设备,默认是 KB 为单位 [root@LinServ-1 ~]# df 文件系统 1K-块 已用 可用 已用% 挂载点 @@ -80,7 +80,7 @@ none 0 0 0 - /proc/sys/fs/binfmt_misc 示例: -```sh +```bash # 显示目录或者文件所占空间 root@localhost [test]# du 608 ./test6 @@ -138,7 +138,7 @@ root@localhost [test]# du 示例: -```sh +```bash free -t # 以总和的形式显示内存的使用信息 free -s 10 # 周期性的查询内存使用信息,每10s 执行一次命令 @@ -159,7 +159,7 @@ Swap: 4094 0 4094 示例: -```sh +```bash Total DISK read: 0.00 B/s | Total DISK write: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> command 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init [3] diff --git a/docs/linux/cli/09.Linux软件管理.md b/docs/linux/cli/09.Linux软件管理.md index 7132590..1182438 100644 --- a/docs/linux/cli/09.Linux软件管理.md +++ b/docs/linux/cli/09.Linux软件管理.md @@ -39,7 +39,7 @@ rpm -ivh xxx.rpm 这类软件包是包含了源代码的 rpm 包,在安装时需要进行编译 -```sh +```bash rpm -i xxx.src.rpm cd /usr/src/redhat/SPECS rpmbuild -bp xxx.specs #一个和你的软件包同名的specs文件 @@ -53,7 +53,7 @@ make install 使用命令 `rpm -e 包名`,包名可以包含版本号等信息,但是不可以有后缀.rpm,比如卸载软件包 proftpd-1.2.8-1,可以使用下列格式: -```sh +```bash rpm -e proftpd-1.2.8-1 rpm -e proftpd-1.2.8 rpm -e proftpd- @@ -62,7 +62,7 @@ rpm -e proftpd 不可以是下列格式: -```sh +```bash rpm -e proftpd-1.2.8-1.i386.rpm rpm -e proftpd-1.2.8-1.i386 rpm -e proftpd-1.2 @@ -79,7 +79,7 @@ rpm -e proftpd-1 (4)查看与 rpm 包相关的文件和其他信息 -```sh +```bash rpm -qa # 列出所有安装过的包 ``` @@ -176,7 +176,7 @@ deb [web 或 ftp 地址][发行版名字] [main/contrib/non-free] 在修改 /etc/apt/sources.list 或者 /etc/apt/preferences 之后运行该命令。 -```sh +```bash # 更新 apt-get apt-get update diff --git a/docs/linux/cli/命令行的艺术.md b/docs/linux/cli/命令行的艺术.md index 0967de3..8072d2a 100644 --- a/docs/linux/cli/命令行的艺术.md +++ b/docs/linux/cli/命令行的艺术.md @@ -143,7 +143,7 @@ - 使用括号扩展(`{`...`}`)来减少输入相似文本,并自动化文本组合。这在某些情况下会很有用,例如 `mv foo.{txt,pdf} some-dir`(同时移动两个文件),`cp somefile{,.bak}`(会被扩展成 `cp somefile somefile.bak`)或者 `mkdir -p test-{a,b,c}/subtest-{1,2,3}`(会被扩展成所有可能的组合,并创建一个目录树)。 - 通过使用 `<(some command)` 可以将输出视为文件。例如,对比本地文件 `/etc/hosts` 和一个远程文件: -```sh +```bash diff /etc/hosts <(ssh somehost cat /etc/hosts) ``` @@ -180,7 +180,7 @@ - 考虑使用 [`mosh`](https://mosh.mit.edu/) 作为 ssh 的替代品,它使用 UDP 协议。它可以避免连接被中断并且对带宽需求更小,但它需要在服务端做相应的配置。 - 获取八进制形式的文件访问权限(修改系统设置时通常需要,但 `ls` 的功能不那么好用并且通常会搞砸),可以使用类似如下的代码: -```sh +```bash stat -c '%A %a %n' /etc/timezone ``` @@ -241,12 +241,12 @@ - 了解如何使用 `awk` 和 `sed` 来进行简单的数据处理。 参阅 [One-liners](#one-liners) 获取示例。 - 替换一个或多个文件中出现的字符串: -```sh +```bash perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt ``` - 使用 [`repren`](https://github.com/jlevy/repren) 来批量重命名文件,或是在多个文件中搜索替换内容。(有些时候 `rename` 命令也可以批量重命名,但要注意,它在不同 Linux 发行版中的功能并不完全一样。) -```sh +```bash # 将文件、目录和内容全部重命名 foo -> bar: repren --full --preserve-case --from foo --to bar . # 还原所有备份文件 whatever.bak -> whatever: @@ -256,7 +256,7 @@ ``` - 根据 man 页面的描述,`rsync` 是一个快速且非常灵活的文件复制工具。它闻名于设备之间的文件同步,但其实它在本地情况下也同样有用。在安全设置允许下,用 `rsync` 代替 `scp` 可以实现文件续传,而不用重新从头开始。它同时也是删除大量文件的[最快方法](https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html)之一: -```sh +```bash mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir ``` @@ -277,7 +277,7 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir - 制作二进制差分文件(Delta 压缩),使用 `xdelta3`。 - 使用 `iconv` 更改文本编码。需要更高级的功能,可以使用 `uconv`,它支持一些高级的 Unicode 功能。例如,这条命令移除了所有重音符号: -```sh +```bash uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt ``` @@ -290,7 +290,7 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir - 文件属性可以通过 `chattr` 进行设置,它比文件权限更加底层。例如,为了保护文件不被意外删除,可以使用不可修改标记:`sudo chattr +i /critical/directory/or/file` - 使用 `getfacl` 和 `setfacl` 以保存和恢复文件权限。例如: -```sh +```bash getfacl -R /some/path > permissions.txt setfacl --restore=permissions.txt ``` @@ -346,7 +346,7 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir 一些命令组合的例子: - 当你需要对文本文件做集合交、并、差运算时,`sort` 和 `uniq` 会是你的好帮手。具体例子请参照代码后面的,此处假设 `a` 与 `b` 是两内容不同的文件。这种方式效率很高,并且在小文件和上 G 的文件上都能运用(注意尽管在 `/tmp` 在一个小的根分区上时你可能需要 `-T` 参数,但是实际上 `sort` 并不被内存大小约束),参阅前文中关于 `LC_ALL` 和 `sort` 的 `-u` 参数的部分。 -```sh +```bash sort a b | uniq > c # c 是 a 并 b sort a b | uniq -d > c # c 是 a 交 b sort a b b | uniq -u > c # c 是 a - b @@ -356,24 +356,24 @@ mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir - 计算文本文件第三列中所有数的和(可能比同等作用的 Python 代码快三倍且代码量少三倍): -```sh +```bash awk '{ x += $3 } END { print x }' myfile ``` - 如果你想在文件树上查看大小/日期,这可能看起来像递归版的 `ls -l` 但比 `ls -lR` 更易于理解: -```sh +```bash find . -type f -ls ``` - 假设你有一个类似于 web 服务器日志文件的文本文件,并且一个确定的值只会出现在某些行上,假设一个 `acct_id` 参数在 URI 中。如果你想计算出每个 `acct_id` 值有多少次请求,使用如下代码: -```sh +```bash egrep -o 'acct_id=[0-9]+' access.log | cut -d= -f2 | sort | uniq -c | sort -rn ``` - 要持续监测文件改动,可以使用 `watch`,例如检查某个文件夹中文件的改变,可以用 `watch -d -n 2 'ls -rtlh | tail'`;或者在排查 WiFi 设置故障时要监测网络设置的更改,可以用 `watch -d -n 2 ifconfig`。 - 运行这个函数从这篇文档中随机获取一条技巧(解析 Markdown 文件并抽取项目): -```sh +```bash function taocl() { curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README-zh.md| pandoc -f markdown -t html | diff --git a/docs/linux/ops/linux典型运维应用.md b/docs/linux/ops/linux典型运维应用.md index e30f670..1e5bd3b 100644 --- a/docs/linux/ops/linux典型运维应用.md +++ b/docs/linux/ops/linux典型运维应用.md @@ -40,7 +40,7 @@ nameserver 8.8.8.8 firewalld 的基本使用 -```sh +```bash 启动:systemctl start firewalld 关闭:systemctl stop firewalld 查看状态:systemctl status firewalld @@ -148,7 +148,7 @@ systemctl restart crond.service 执行 `vim /etc/rc.local` 命令,输入以下内容: -```sh +```bash #!/bin/sh # # This script will be executed *after* all the other init scripts. @@ -190,7 +190,7 @@ Linux 开机的时候,会加载运行 `/etc/rc.d/init.d` 目录下的程序, (2)查看当前系统的启动级别 -```sh +```bash $ runlevel N 3 ``` @@ -292,7 +292,7 @@ MAILTO=root 设置方法: -```sh +```bash $ sed -i 's/id:5:initdefault:/id:3:initdefault:/' /etc/inittab ``` diff --git a/docs/linux/ops/samba使用详解.md b/docs/linux/ops/samba使用详解.md index da0642b..e9f8416 100644 --- a/docs/linux/ops/samba使用详解.md +++ b/docs/linux/ops/samba使用详解.md @@ -60,7 +60,7 @@ samba 服务的配置文件是 `/etc/samba/smb.conf`,如果没有则 samba 无 执行以下命令,编辑配置文件: -```sh +```bash vim /etc/samba/smb.conf ``` @@ -124,7 +124,7 @@ vim /etc/samba/smb.conf 创建的 samba 用户必须是 Linux 机器上实际存在的用户。 -```sh +```bash $ sudo smbpasswd -a root New SMB password: Retype new SMB password: @@ -140,14 +140,14 @@ Added user root. CentOS 6 -```sh +```bash $ sudo service samba restart # 重启 samba $ sudo service smb restart # 重启 samba ``` CentOS 7 -```sh +```bash $ sudo systemctl start smb.service # 启动 samba $ sudo systemctl restart smb.service # 重启 samba $ sudo systemctl enable smb.service # 设置开机自动启动 @@ -441,7 +441,7 @@ guest ok = yes 1. 检查是否配置了防火墙规则 -```sh +```bash # 一种方法是强行关闭防火墙 $ sudo service iptables stop @@ -452,7 +452,7 @@ $ sudo firewall-cmd --reload 2. 关闭 selinux -```sh +```bash # 将 /etc/selinux/config 文件中的 SELINUX 设为 disabled $ sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config diff --git a/docs/linux/soft/elastic/elastic-beats.md b/docs/linux/soft/elastic/elastic-beats.md index aa31dc6..a94b869 100644 --- a/docs/linux/soft/elastic/elastic-beats.md +++ b/docs/linux/soft/elastic/elastic-beats.md @@ -208,7 +208,7 @@ filebeat 提供了一系列命令来完成各种功能。 执行命令方式: -```sh +```bash ./filebeat COMMAND ``` @@ -224,7 +224,7 @@ filebeat 提供了一系列命令来完成各种功能。 > > **示例** 指定配置文件启动 > -> ```sh +> ```bash > ./filebeat run -e -c filebeat.yml -d "publish" > ./filebeat -e -c filebeat.yml -d "publish" # run 可以省略 > ``` diff --git a/docs/linux/soft/elastic/elastic-quickstart.md b/docs/linux/soft/elastic/elastic-quickstart.md index 6c754ab..31bafd4 100644 --- a/docs/linux/soft/elastic/elastic-quickstart.md +++ b/docs/linux/soft/elastic/elastic-quickstart.md @@ -52,7 +52,7 @@ ELK 是 elastic 公司旗下三款产品 [ElasticSearch](https://www.elastic.co/ ELK 要求本地环境中安装了 JDK 。如果不确定是否已安装,可使用下面的命令检查: -```sh +```bash java -version ``` @@ -127,7 +127,7 @@ can not run elasticsearch as root **解决方法:**使用非 root 权限账号运行 elasticsearch -```sh +```bash # 创建用户组 groupadd elk # 创建新用户,-g elk 设置其用户组为 elk,-p elk 设置其密码为 elk diff --git a/docs/linux/soft/jdk.md b/docs/linux/soft/jdk.md index b653379..bd921cb 100644 --- a/docs/linux/soft/jdk.md +++ b/docs/linux/soft/jdk.md @@ -91,7 +91,7 @@ b. 键入命令: **java -version**、**java**、**javac** 几个命令,出现 (2)解压压缩包到本地 -```sh +```bash $ tar -zxf jdk-8u162-linux-x64.tar.gz ``` @@ -99,7 +99,7 @@ $ tar -zxf jdk-8u162-linux-x64.tar.gz 执行 `/etc/profile` 命令,添加以下内容: -```sh +```bash # JDK 的根路径 export JAVA_HOME=/opt/java/jdk1.8.0_162 export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib @@ -120,7 +120,7 @@ export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH (2)选择一个合适的版本安装 -```sh +```bash $ rpm -ivh jdk-8u181-linux-x64.rpm ``` diff --git a/docs/linux/soft/jenkins.md b/docs/linux/soft/jenkins.md index ed22882..c5e7846 100644 --- a/docs/linux/soft/jenkins.md +++ b/docs/linux/soft/jenkins.md @@ -101,7 +101,7 @@ nohup java -jar jenkins.war --httpPort=8080 >> nohup.out 2>&1 & 或者直接执行命令: -```sh +```bash sed -i 's/www.google.com/www.baidu.com/g' /root/.jenkins/updates/default.json ``` @@ -115,7 +115,7 @@ sed -i 's/www.google.com/www.baidu.com/g' /root/.jenkins/updates/default.json 或者直接执行命令: -```sh +```bash sed -i '/^/s/.*/http:\/\/mirror.xmission.com\/jenkins\/updates\/update-center.json<\/url>/g' /root/.jenkins/hudson.model.UpdateCenter.xml ``` diff --git a/docs/linux/soft/rocketmq.md b/docs/linux/soft/rocketmq.md index b5abd42..f7bac1d 100644 --- a/docs/linux/soft/rocketmq.md +++ b/docs/linux/soft/rocketmq.md @@ -29,14 +29,14 @@ 解压到本地: -```sh +```bash > unzip rocketmq-all-4.2.0-source-release.zip > cd rocketmq-all-4.2.0/ ``` ## 启动 Name Server -```sh +```bash > nohup sh bin/mqnamesrv & > tail -f ~/logs/rocketmqlogs/namesrv.log The Name Server boot success... @@ -44,7 +44,7 @@ The Name Server boot success... ## 启动 Broker -```sh +```bash > nohup sh bin/mqbroker -n localhost:9876 -c conf/broker.conf & > tail -f ~/logs/rocketmqlogs/broker.log The broker[%s, 172.30.30.233:10911] boot success... @@ -54,7 +54,7 @@ The broker[%s, 172.30.30.233:10911] boot success... 执行收发消息操作之前,不许告诉客户端命名服务器的位置。在 RocketMQ 中有多种方法来实现这个目的。这里,我们使用最简单的方法——设置环境变量 `NAMESRV_ADDR` : -```sh +```bash > export NAMESRV_ADDR=localhost:9876 > sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer SendResult [sendStatus=SEND_OK, msgId= ... @@ -65,7 +65,7 @@ ConsumeMessageThread_%d Receive New Messages: [MessageExt... ## 关闭服务器 -```sh +```bash > sh bin/mqshutdown broker The mqbroker(36695) is running... Send shutdown request to mqbroker(36695) OK @@ -113,7 +113,7 @@ brokerIP1 = 10.10.30.63 启动时需要指定配置文件 -```sh +```bash nohup sh bin/mqbroker -n localhost:9876 -c conf/broker.conf & ``` diff --git a/docs/linux/soft/svn.md b/docs/linux/soft/svn.md index 2526b0e..8f2add0 100644 --- a/docs/linux/soft/svn.md +++ b/docs/linux/soft/svn.md @@ -21,13 +21,13 @@ Svn 是 Subversion 的简称,是一个开放源代码的版本控制系统, ### 1.1. 安装 svn -```sh +```bash $ yum install -y subversion ``` ### 1.2. 创建 svn 仓库 -```sh +```bash $ mkdir -p /share/svn $ svnadmin create /share/svn $ ls /share/svn @@ -42,7 +42,7 @@ conf db format hooks locks README.txt ### 1.3. 配置 svnserve.conf -```sh +```bash $ vim /share/svn/conf/svnserve.conf ``` @@ -58,7 +58,7 @@ realm = /share/svn # 认证空间名,版本库所在目录 ### 1.4. 配置 passwd -```sh +```bash $ vim /share/svn/conf/passwd ``` @@ -73,7 +73,7 @@ user3 = 123456 ### 1.5. 配置 authz -```sh +```bash $ vim /share/svn/conf/authz ``` @@ -89,7 +89,7 @@ user3 = rw ### 1.6. 启动关闭 svn -```sh +```bash $ svnserve -d -r /share/svn # 启动 svn $ killall svnserve # 关闭 svn ``` @@ -102,13 +102,13 @@ $ killall svnserve # 关闭 svn 编辑 `/etc/rc.d/rc.local` 文件: -```sh +```bash $ vi /etc/rc.d/rc.local ``` 输入以下内容: -```sh +```bash # 开机自动启动 svn,默认端口是 3690 $ /usr/bin/svnserve -d -r /share/svn --listen-port 3690 ``` @@ -125,7 +125,7 @@ CentOS 7 中的 `/etc/rc.d/rc.local` 是没有执行权限的,系统建议创 找到 svn 的 service 配置文件 `/etc/sysconfig/svnserve` 编辑配置文件 -```sh +```bash $ vi /etc/sysconfig/svnserve ``` diff --git a/docs/linux/tool/git/advanced/git-flow.md b/docs/linux/tool/git/advanced/git-flow.md index 1d4fc30..3fb3c19 100644 --- a/docs/linux/tool/git/advanced/git-flow.md +++ b/docs/linux/tool/git/advanced/git-flow.md @@ -108,14 +108,14 @@ Git 是一个非常优秀的版本控制工具,但是在实际版本管理中 a. 创建develop分支 -```sh +```bash git branch develop git push -u origin develop ``` b. 开始新Feature开发 -```sh +```bash git checkout -b some-feature develop # Optionally, push branch to origin: git push -u origin some-feature @@ -128,7 +128,7 @@ git commit c. 完成Feature -```sh +```bash git pull origin develop git checkout develop git merge --no-ff some-feature @@ -142,7 +142,7 @@ git push origin --delete some-feature d. 开始Relase -```sh +```bash git checkout -b release-0.1.0 develop # Optional: Bump version number, commit @@ -151,7 +151,7 @@ git checkout -b release-0.1.0 develop e. 完成Release -```sh +```bash git checkout master git merge --no-ff release-0.1.0 git push @@ -172,13 +172,13 @@ git push --tags f. 开始Hotfix -```sh +```bash git checkout -b hotfix-0.1.1 master ``` g. 完成Hotfix -```sh +```bash git checkout master git merge --no-ff hotfix-0.1.1 git push diff --git a/docs/linux/tool/git/appendix/git-faq.md b/docs/linux/tool/git/appendix/git-faq.md index c3bf92d..d3195c2 100644 --- a/docs/linux/tool/git/appendix/git-faq.md +++ b/docs/linux/tool/git/appendix/git-faq.md @@ -65,13 +65,13 @@ 如果你用 `git commit -a` 提交了一次变化(changes),而你又不确定到底这次提交了哪些内容。 你就可以用下面的命令显示当前`HEAD`上的最近一次的提交(commit): -```sh +```bash (master)$ git show ``` 或者 -```sh +```bash $ git log -n1 -p ``` @@ -79,13 +79,13 @@ $ git log -n1 -p 如果你的提交信息(commit message)写错了且这次提交(commit)还没有推(push), 你可以通过下面的方法来修改提交信息(commit message): -```sh +```bash $ git commit --amend ``` 这会打开你的默认编辑器, 在这里你可以编辑信息. 另一方面, 你也可以用一条命令一次完成: -```sh +```bash $ git commit --amend -m 'xxxxxxx' ``` @@ -95,7 +95,7 @@ $ git commit --amend -m 'xxxxxxx' 如果这只是单个提交(commit),修改它: -```sh +```bash $ git commit --amend --author "New Authorname " ``` @@ -105,7 +105,7 @@ $ git commit --amend --author "New Authorname " 通过下面的方法,从一个提交(commit)里移除一个文件: -```sh +```bash $ git checkout HEAD^ myfile $ git add -A $ git commit --amend @@ -117,7 +117,7 @@ $ git commit --amend 如果你需要删除推了的提交(pushed commits),你可以使用下面的方法。可是,这会不可逆的改变你的历史,也会搞乱那些已经从该仓库拉取(pulled)了的人的历史。简而言之,如果你不是很确定,千万不要这么做。 -```sh +```bash $ git reset HEAD^ --hard $ git push -f [remote] [branch] ``` @@ -135,7 +135,7 @@ $ git push -f [remote] [branch] 同样的警告:不到万不得已的时候不要这么做. -```sh +```bash $ git rebase --onto SHA1_OF_BAD_COMMIT^ SHA1_OF_BAD_COMMIT $ git push -f [remote] [branch] ``` @@ -144,7 +144,7 @@ $ git push -f [remote] [branch] ### 我尝试推一个修正后的提交(amended commit)到远程,但是报错: -```sh +```bash To https://github.com/yourusername/repo.git ! [rejected] mybranch -> mybranch (non-fast-forward) error: failed to push some refs to 'https://github.com/tanay1337/webmaker.org.git' @@ -156,7 +156,7 @@ hint: See the 'Note about fast-forwards' in 'git push --help' for details. 注意, rebasing(见下面)和修正(amending)会用一个**新的提交(commit)代替旧的**, 所以如果之前你已经往远程仓库上推过一次修正前的提交(commit),那你现在就必须强推(force push) (`-f`)。 注意 – *总是* 确保你指明一个分支! -```sh +```bash (my-branch)$ git push origin mybranch -f ``` @@ -166,13 +166,13 @@ hint: See the 'Note about fast-forwards' in 'git push --help' for details. 如果你意外的做了 `git reset --hard`, 你通常能找回你的提交(commit), 因为Git对每件事都会有日志,且都会保存几天。 -```sh +```bash (master)$ git reflog ``` 你将会看到一个你过去提交(commit)的列表, 和一个重置的提交。 选择你想要回到的提交(commit)的SHA,再重置一次: -```sh +```bash (master)$ git reset --hard SHA1234 ``` @@ -182,7 +182,7 @@ hint: See the 'Note about fast-forwards' in 'git push --help' for details. ### 我需要把暂存的内容添加到上一次的提交(commit) -```sh +```bash (my-branch*)$ git commit --amend ``` @@ -191,13 +191,13 @@ hint: See the 'Note about fast-forwards' in 'git push --help' for details. 一般来说, 如果你想暂存一个文件的一部分, 你可这样做: -```sh +```bash $ git add --patch filename.x ``` `-p` 简写。这会打开交互模式, 你将能够用 `s` 选项来分隔提交(commit); 然而, 如果这个文件是新的, 会没有这个选择, 添加一个新文件时, 这样做: -```sh +```bash $ git add -N filename.x ``` @@ -211,7 +211,7 @@ $ git add -N filename.x 这个有点困难, 我能想到的最好的方法是先stash未暂存的内容, 然后重置(reset),再pop第一步stashed的内容, 最后再add它们。 -```sh +```bash $ git stash -k $ git reset --hard $ git stash pop @@ -222,13 +222,13 @@ $ git add -A ### 我想把未暂存的内容移动到一个新分支 -```sh +```bash $ git checkout -b my-branch ``` ### 我想把未暂存的内容移动到另一个已存在的分支 -```sh +```bash $ git stash $ git checkout my-branch $ git stash pop @@ -238,7 +238,7 @@ $ git stash pop 如果你只是想重置源(origin)和你本地(local)之间的一些提交(commit),你可以: -```sh +```bash # one commit (my-branch)$ git reset --hard HEAD^ # two commits @@ -251,7 +251,7 @@ $ git stash pop 重置某个特殊的文件, 你可以用文件名做为参数: -```sh +```bash $ git reset filename ``` @@ -261,14 +261,14 @@ $ git reset filename 签出(checkout)不需要的内容,保留需要的。 -```sh +```bash $ git checkout -p # Answer y to all of the snippets you want to drop ``` 另外一个方法是使用 `stash`, Stash所有要保留下的内容, 重置工作拷贝, 重新应用保留的部分。 -```sh +```bash $ git stash -p # Select all of the snippets you want to save $ git reset --hard @@ -277,7 +277,7 @@ $ git stash pop 或者, stash 你不需要的部分, 然后stash drop。 -```sh +```bash $ git stash -p # Select all of the snippets you don't want to save $ git stash drop @@ -289,7 +289,7 @@ $ git stash drop 这是另外一种使用 `git reflog` 情况,找到在这次错误拉(pull) 之前HEAD的指向。 -```sh +```bash (master)$ git reflog ab7555f HEAD@{0}: pull origin wrong-branch: Fast-forward c5bc55a HEAD@{1}: checkout: checkout message goes here @@ -297,7 +297,7 @@ c5bc55a HEAD@{1}: checkout: checkout message goes here 重置分支到你所需的提交(desired commit): -```sh +```bash $ git reset --hard c5bc55a ``` @@ -309,7 +309,7 @@ $ git reset --hard c5bc55a `git status` 会显示你领先(ahead)源(origin)多少个提交: -```sh +```bash (my-branch)$ git status # On branch my-branch # Your branch is ahead of 'origin/my-branch' by 2 commits. @@ -319,7 +319,7 @@ $ git reset --hard c5bc55a 一种方法是: -```sh +```bash (master)$ git reset --hard origin/my-branch ``` @@ -327,13 +327,13 @@ $ git reset --hard c5bc55a 在master下创建一个新分支,不切换到新分支,仍在master下: -```sh +```bash (master)$ git branch my-branch ``` 把master分支重置到前一个提交: -```sh +```bash (master)$ git reset --hard HEAD^ ``` @@ -343,14 +343,14 @@ $ git reset --hard c5bc55a 例如, master分支想重置到的提交的hash为`a13b85e`: -```sh +```bash (master)$ git reset --hard a13b85e HEAD is now at a13b85e ``` 签出(checkout)刚才新建的分支继续工作: -```sh +```bash (master)$ git checkout my-branch ``` @@ -358,7 +358,7 @@ HEAD is now at a13b85e 假设你正在做一个原型方案(原文为working spike (see note)), 有成百的内容,每个都工作得很好。现在, 你提交到了一个分支,保存工作内容: -```sh +```bash (solution)$ git add -A && git commit -m "Adding all changes from this spike into one big commit." ``` @@ -371,13 +371,13 @@ HEAD is now at a13b85e 我去可以通过把内容拿到你的分支里,来解决这个问题: -```sh +```bash (develop)$ git checkout solution -- file1.txt ``` 这会把这个文件内容从分支 `solution` 拿到分支 `develop` 里来: -```sh +```bash # On branch develop # Your branch is up-to-date with 'origin/develop'. # Changes to be committed: @@ -394,7 +394,7 @@ Note: Spike solutions are made to analyze or solve the problem. These solutions 假设你有一个`master`分支, 执行`git log`, 你看到你做过两次提交: -```sh +```bash (master)$ git log commit e3851e817c451cc36f2e6f3049db528415e3c114 @@ -420,21 +420,21 @@ Date: Tue Jul 21 01:12:48 2014 -0400 首先, 我们把`master`分支重置到正确的提交(`a13b85e`): -```sh +```bash (master)$ git reset --hard a13b85e HEAD is now at a13b85e ``` 现在, 我们对 bug #21 创建一个新的分支: -```sh +```bash (master)$ git checkout -b 21 (21)$ ``` 接着, 我们用 *cherry-pick* 把对bug #21的提交放入当前分支。 这意味着我们将应用(apply)这个提交(commit),仅仅这一个提交(commit),直接在HEAD上面。 -```sh +```bash (21)$ git cherry-pick e3851e8 ``` @@ -442,7 +442,7 @@ HEAD is now at a13b85e 再者, 我们为bug #14 创建一个新的分支, 也基于`master`分支 -```sh +```bash (21)$ git checkout master (master)$ git checkout -b 14 (14)$ @@ -450,14 +450,14 @@ HEAD is now at a13b85e 最后, 为 bug #14 执行 `cherry-pick`: -```sh +```bash (14)$ git cherry-pick 5ea5173 ``` ### 我想删除上游(upstream)分支被删除了的本地分支 一旦你在github 上面合并(merge)了一个pull request, 你就可以删除你fork里被合并的分支。 如果你不准备继续在这个分支里工作, 删除这个分支的本地拷贝会更干净,使你不会陷入工作分支和一堆陈旧分支的混乱之中。 -```sh +```bash $ git fetch -p ``` @@ -465,7 +465,7 @@ $ git fetch -p 如果你定期推送到远程, 多数情况下应该是安全的,但有些时候还是可能删除了还没有推到远程的分支。 让我们先创建一个分支和一个新的文件: -```sh +```bash (master)$ git checkout -b my-branch (my-branch)$ git branch (my-branch)$ touch foo.txt @@ -475,7 +475,7 @@ README.md foo.txt 添加文件并做一次提交 -```sh +```bash (my-branch)$ git add . (my-branch)$ git commit -m 'foo.txt added' (my-branch)$ foo.txt added @@ -498,7 +498,7 @@ Date: Tue Jul 29 13:14:46 2014 -0400 现在我们切回到主(master)分支,‘不小心的’删除`my-branch`分支 -```sh +```bash (my-branch)$ git checkout master Switched to branch 'master' Your branch is up-to-date with 'origin/master'. @@ -519,7 +519,7 @@ oh noes, deleted my branch! 正如你所见,我们有一个来自删除分支的提交hash(commit hash),接下来看看是否能恢复删除了的分支。 -```sh +```bash (master)$ git checkout -b my-branch-help Switched to a new branch 'my-branch-help' (my-branch-help)$ git reset --hard 4e3cd85 @@ -534,19 +534,19 @@ README.md foo.txt 删除一个远程分支: -```sh +```bash (master)$ git push origin --delete my-branch ``` 你也可以: -```sh +```bash (master)$ git push origin :my-branch ``` 删除一个本地分支: -```sh +```bash (master)$ git branch -D my-branch ``` @@ -554,13 +554,13 @@ README.md foo.txt 首先, 从远程拉取(fetch) 所有分支: -```sh +```bash (master)$ git fetch --all ``` 假设你想要从远程的`daves`分支签出到本地的`daves` -```sh +```bash (master)$ git checkout --track origin/daves Branch daves set up to track remote branch daves from origin. Switched to a new branch 'daves' @@ -576,7 +576,7 @@ Switched to a new branch 'daves' 你可以合并(merge)或rebase了一个错误的分支, 或者完成不了一个进行中的rebase/merge。 Git 在进行危险操作的时候会把原始的HEAD保存在一个叫ORIG_HEAD的变量里, 所以要把分支恢复到rebase/merge前的状态是很容易的。 -```sh +```bash (my-branch)$ git reset --hard ORIG_HEAD ``` @@ -584,7 +584,7 @@ Switched to a new branch 'daves' 不幸的是,如果你想把这些变化(changes)反应到远程分支上,你就必须得强推(force push)。 是因你快进(Fast forward)了提交,改变了Git历史, 远程分支不会接受变化(changes),除非强推(force push)。这就是许多人使用 merge 工作流, 而不是 rebasing 工作流的主要原因之一, 开发者的强推(force push)会使大的团队陷入麻烦。使用时需要注意,一种安全使用 rebase 的方法是,不要把你的变化(changes)反映到远程分支上, 而是按下面的做: -```sh +```bash (master)$ git checkout my-branch (my-branch)$ git rebase -i master (my-branch)$ git checkout master @@ -597,20 +597,20 @@ Switched to a new branch 'daves' 假设你的工作分支将会做对于 `master` 的pull-request。 一般情况下你不关心提交(commit)的时间戳,只想组合 *所有* 提交(commit) 到一个单独的里面, 然后重置(reset)重提交(recommit)。 确保主(master)分支是最新的和你的变化都已经提交了, 然后: -```sh +```bash (my-branch)$ git reset --soft master (my-branch)$ git commit -am "New awesome feature" ``` 如果你想要更多的控制, 想要保留时间戳, 你需要做交互式rebase (interactive rebase): -```sh +```bash (my-branch)$ git rebase -i master ``` 如果没有相对的其它分支, 你将不得不相对自己的`HEAD` 进行 rebase。 例如:你想组合最近的两次提交(commit), 你将相对于`HEAD\~2` 进行rebase, 组合最近3次提交(commit), 相对于`HEAD\~3`, 等等。 -```sh +```bash (master)$ git rebase -i HEAD~2 ``` @@ -681,20 +681,20 @@ Newer, awesomer features 如果成功了, 你应该看到类似下面的内容: -```sh +```bash (master)$ Successfully rebased and updated refs/heads/master. ``` #### 安全合并(merging)策略 `--no-commit` 执行合并(merge)但不自动提交, 给用户在做提交前检查和修改的机会。 `no-ff` 会为特性分支(feature branch)的存在过留下证据, 保持项目历史一致。 -```sh +```bash (master)$ git merge --no-ff --no-commit my-branch ``` #### 我需要将一个分支合并成一个提交(commit) -```sh +```bash (master)$ git merge --squash my-branch ``` @@ -702,7 +702,7 @@ Newer, awesomer features 有时候,在将数据推向上游之前,你有几个正在进行的工作提交(commit)。这时候不希望把已经推(push)过的组合进来,因为其他人可能已经有提交(commit)引用它们了。 -```sh +```bash (master)$ git rebase -i @{u} ``` @@ -712,13 +712,13 @@ Newer, awesomer features 检查一个分支上的所有提交(commit)是否都已经合并(merge)到了其它分支, 你应该在这些分支的head(或任何 commits)之间做一次diff: -```sh +```bash (master)$ git log --graph --left-right --cherry-pick --oneline HEAD...feature/120-on-scroll ``` 这会告诉你在一个分支里有而另一个分支没有的所有提交(commit), 和分支之间不共享的提交(commit)的列表。 另一个做法可以是: -```sh +```bash (master)$ git log master ^feature/120-on-scroll --no-merges ``` @@ -742,7 +742,7 @@ noop 首先执行 `git status` 找出哪些文件有冲突: -```sh +```bash (my-branch)$ git status On branch my-branch Changes not staged for commit: @@ -766,13 +766,13 @@ Changes not staged for commit: 有时候这些合并非常复杂,你应该使用可视化的差异编辑器(visual diff editor): -```sh +```bash (master*)$ git mergetool -t opendiff ``` 在你解决完所有冲突和测试过后, `git add` 变化了的(changed)文件, 然后用`git rebase --continue` 继续rebase。 -```sh +```bash (my-branch)$ git add README.md (my-branch)$ git rebase --continue ``` @@ -781,7 +781,7 @@ Changes not staged for commit: 任何时候你想结束整个rebase 过程,回来rebase前的分支状态, 你可以做: -```sh +```bash (my-branch)$ git rebase --abort ``` @@ -789,19 +789,19 @@ Changes not staged for commit: ### 克隆所有子模块 -```sh +```bash $ git clone --recursive git://github.com/foo/bar.git ``` 如果已经克隆了: -```sh +```bash $ git submodule update --init --recursive ``` ### 删除标签(tag) -```sh +```bash $ git tag -d $ git push :refs/tags/ ``` @@ -810,13 +810,13 @@ $ git push :refs/tags/ 如果你想恢复一个已删除标签(tag), 可以按照下面的步骤: 首先, 需要找到无法访问的标签(unreachable tag): -```sh +```bash $ git fsck --unreachable | grep tag ``` 记下这个标签(tag)的hash,然后用Git的 [update-ref](http://git-scm.com/docs/git-update-ref): -```sh +```bash $ git update-ref refs/tags/ ``` @@ -832,13 +832,13 @@ $ git update-ref refs/tags/ ### 我只想改变一个文件名字的大小写,而不修改内容 -```sh +```bash (master)$ git mv --force myfile MyFile ``` ### 我想从Git删除一个文件,但保留该文件 -```sh +```bash (master)$ git rm --cached log.txt ``` @@ -875,12 +875,12 @@ $ git update-ref refs/tags/ 你可能有一个仓库需要授权,这时你可以缓存用户名和密码,而不用每次推/拉(push/pull)的时候都输入,Credential helper能帮你。 -```sh +```bash $ git config --global credential.helper cache # Set git to use the credential memory cache ``` -```sh +```bash $ git config --global credential.helper 'cache --timeout=3600' # Set the cache to timeout after 1 hour (setting is in seconds) ``` @@ -891,7 +891,7 @@ $ git config --global credential.helper 'cache --timeout=3600' 这就是 `git reflog` 的目的, `reflog` 记录对分支顶端(the tip of a branch)的任何改变, 即使那个顶端没有被任何分支或标签引用。基本上, 每次HEAD的改变, 一条新的记录就会增加到`reflog`。遗憾的是,这只对本地分支起作用,且它只跟踪动作 (例如,不会跟踪一个没有被记录的文件的任何改变)。 -```sh +```bash (master)$ git reflog 0a2e358 HEAD@{0}: reset: moving to HEAD\~2 0254ea7 HEAD@{1}: checkout: moving from 2.2 to master @@ -902,7 +902,7 @@ c10f740 HEAD@{2}: checkout: moving from master to 2.2 如果事实证明你不小心回移(move back)了提交(commit), reflog 会包含你不小心回移前master上指向的提交(0254ea7)。 -```sh +```bash $ git reset --hard 0254ea7 ``` diff --git a/docs/linux/tool/git/git-quickstart.md b/docs/linux/tool/git/git-quickstart.md index ee66a17..d2ff85d 100644 --- a/docs/linux/tool/git/git-quickstart.md +++ b/docs/linux/tool/git/git-quickstart.md @@ -117,7 +117,7 @@ Git 中使用这种哈希值的情况很多,你将经常看到这种哈希值 如果你使用的系统是 Debian/Ubuntu , 安装命令为: -```sh +```bash $ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \ > libz-dev libssl-dev $ apt-get install git-core @@ -129,7 +129,7 @@ git version 1.8.1.2 如果你使用的系统是 Centos/RedHat ,安装命令为: -```sh +```bash $ yum install curl-devel expat-devel gettext-devel \ > openssl-devel zlib-devel $ yum -y install git-core @@ -196,7 +196,7 @@ $ git config --global user.email johndoe@example.com #### 克隆一个已创建的仓库 -```sh +```bash # 通过 SSH $ git clone ssh://user@domain.com/repo.git @@ -206,7 +206,7 @@ $ git clone http://domain.com/user/repo.git #### 创建一个新的本地仓库 -```sh +```bash $ git init ``` @@ -214,7 +214,7 @@ $ git init #### 添加修改到暂存区 -```sh +```bash # 把指定文件添加到暂存区 $ git add xxx @@ -227,7 +227,7 @@ $ git add -A #### 提交修改到本地仓库 -```sh +```bash # 提交本地的所有修改 $ git commit -a @@ -244,7 +244,7 @@ $ git commit -m 'commit message' 官方称之为储藏,但我个人更喜欢称之为存草稿。 -```sh +```bash # 1. 将修改作为当前分支的草稿保存 $ git stash @@ -263,7 +263,7 @@ $ git stash apply stash@{0} #### 撤销本地修改 -```sh +```bash # 移除缓存区的所有文件(i.e. 撤销上次git add) $ git reset HEAD @@ -288,7 +288,7 @@ $ git checkout HEAD ##### 删除添加`.gitignore`文件前错误提交的文件 -```sh +```bash $ git rm -r --cached . $ git add . $ git commit -m "remove xyz file" @@ -298,13 +298,13 @@ $ git commit -m "remove xyz file" #### 创建一个新的提交,并回滚到指定版本 -```sh +```bash $ git revert ``` #### 彻底删除指定版本 -```sh +```bash # 执行下面命令后,commit-hash 提交后的记录都会被彻底删除,使用需谨慎 $ git reset --hard $ git push -f @@ -314,7 +314,7 @@ $ git push -f #### 更新 -```sh +```bash # 下载远程端版本,但不合并到HEAD中 $ git fetch @@ -327,7 +327,7 @@ $ git pull --rebase #### 推送 -```sh +```bash # 将本地版本推送到远程端 $ git push remote @@ -343,19 +343,19 @@ $ git push --tags #### 显示工作路径下已修改的文件 -```sh +```bash $ git status ``` #### 显示与上次提交版本文件的不同 -```sh +```bash $ git diff ``` #### 显示提交历史 -```sh +```bash # 从最新提交开始,显示所有的提交记录(显示hash, 作者信息,提交的标题和时间) $ git log @@ -368,7 +368,7 @@ $ git log -p #### 显示搜索内容 -```sh +```bash # 从当前目录的所有文件中查找文本内容 $ git grep "Hello" @@ -380,7 +380,7 @@ $ git grep "Hello" v2.5 #### 增删查分支 -```sh +```bash # 列出所有的分支 $ git branch @@ -402,7 +402,7 @@ $ git branch -D #### 切换分支 -```sh +```bash # 切换分支 $ git checkout @@ -412,7 +412,7 @@ $ git checkout -b #### 标签 -```sh +```bash # 给当前版本打标签 $ git tag @@ -430,14 +430,14 @@ $ git tag -a #### 合并 -```sh +```bash # 将分支合并到当前HEAD中 $ git merge ``` #### 重置 -```sh +```bash # 将当前HEAD版本重置到分支中,请勿重置已发布的提交 $ git rebase ```