kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp

vim基本操作

简单配置

1
2
3
4
5
6
7
8
9
10
11
set tabstop=8
set shiftwidth=8
set autoindent
set cindent
set nu
set hlsearch

# vim 乱码
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8

恢复文件关闭之前光标的位置
Vim的全局配置/etc/vim/vimrc,被注释的这么几行:取消注释,g后面的'改成`,改好如下

1
2
3
if has("autocmd")
	au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
endif

添加vim状态栏

1
2
3
4
5
6
7
8
9
10
11
12
13
set laststatus=2
set statusline=
set statusline+=%n\                            " buffer number
set statusline+=%f\                            " filename
set statusline+=%h%m%r%w                       " status flags
set statusline+=\[%{strlen(&ft)?&ft:'none'}]\  " file type
set statusline+=%P\                            " file position
set statusline+=%(%l,%c%V%)\                   " line, character
set statusline+=%=                             " right align remainder
set statusline+=0x%-8B                         " character value
set statusline+=%-8{&fenc}\  
set statusline+=%{getcwd()}\  
set statusline+=%<%{$USER}@%{hostname()}\  
解决vi/vim中粘贴会在行首多很多缩进和空格的问题
  1. 在拷贝前输入:set paste (这样的话,vim就不会启动自动缩进,而只是纯拷贝粘贴)
  2. 拷贝完成之后,输入:set nopaste (关闭paste)

1. Vim的几种模式

Vim提供了诸多模式可供使用,不同模式带有不同的命令功能。

普通模式

启动后的默认模式。普通模式下,用户的按键被解释为各种Vim内置命令(如移动光标,删除/查找/替换文字等)。Vim强大的功能大部分即来自普通模式。在普通模式下,按键'a'或'i等即可切换至插入模式。在其他模式下,按键'ESC'即可切换到普通模式。

插入模式

插入模式,可以理解成编辑模式。在此模式下,用户的大部分按键操作都会被写入到文本缓冲区中,从而影响到正在编辑的文本(在执行写操作前,这些更改只限于对缓冲区中内容,并未写入到磁盘文件中)。

可视模式

类似于普通模式,但光标的移动操作会选中光标所经过的文本内容并高亮显示。执行非移动命令时,命令仅执行于高亮选中部分。命令模式下,按键'v'即切换至可视模式。

其他模式
命令行模式执行Vim内置命令或调用外部程序。普通模式下,输入字符':‘进入命令模式;ESC键返回普通模式,或命令执行完成后自动返回普通模式。
替换模式相当于普通编辑器的覆盖编辑模式。普通模式下,输入字符'R'进入命令模式;ESC键返回普通模式。
块选择模式普通模式下,与可视模式相似,但选择范围为块而非以行为单位。输入ctrl-v进入;ESC键返加。

2. 进入Vim

通过命令行启动Vim时,可以指定待编辑文件名,并通过附加选项指定文件打开后光标所在位置。
快捷键功能vim filename打开文件,如文件不存在则创建vim +n filename打开文件,并将光标置于第n行行首vim + filename打开文件,并将光标置于最后一行行首

3. 文件操作

在Vim命令模式(行)中,可以通过快捷命令进入打开文件/文件保存/退出等操作。
快捷键功能

1
2
3
4
5
6
7
8
9
:e  filename使用新创建缓冲区打开文件filename
:w保存文件,如文件为只读,提示失败
:w!强制保存文件,即使文件为只读(是否成功取决于用户对文件权限)
:w filename将当前缓冲区内容保存为文件filename
:n1, n2, filename将n1到n2行内容保存为文件filename
:q退出当前窗口。如文件内容已改动提示失败
:q!退出,即使文件内容已改动
:wq保存后退出保存后退出
:r filename将filename内容读取到当前光标位置ZZ退出。如有未保存内容,保存后退出

为了防止因程序异常中断而导致正在编辑的内容丢失,Vim打开文件后会自动创建一个.[yourfilename].swp的临时文件用于临时存放正在编辑的内容。如程序异常中止,下一次启动vim编辑文件时,vim会提示发现临时文件,询问用户如何处理,中断当前操作(Abort), 使用临时文件恢复(Recover),删除临时文件(Delete)等。

4. 多文件编辑

Vim支持同时对多个文件进行编辑。

普通多文件编辑: vim filename1 filename2 同时打开两个文件
快捷键功能

1
2
3
4
5
6
7
8
9
10
:bn跳转至下一缓冲区(文件)(最后一个->第一个)
:bN跳转到上一缓冲区(文件)(第一个->最后一个)
:bd关闭当前缓冲区(文件)
:n,:N跳转至下一文件,如当前文件为最后一个,提示错误
:N跳转至上一文件,如当前文件为第一个,提示错误
:next, :previous跳转至下/上一文件:wnext, 
:wprevious保存当前文件并跳转至下/上一文件
:last, :first跳转至最后一个/第一个文件
:files列出当前已打开文件
:args给出进入vim时命令行参数;当前正在编辑文件名用"[]"列出
使用分割窗口编辑多文件

快捷键功能

1
2
3
4
5
6
7
8
9
ctrl-w s水平分割窗口
ctrl-w v垂直分割窗口
ctrl-w w切换至另一窗口
ctrl-w ←切换至左侧窗口
ctrl-w ↑切换至上方窗口
ctrl-w →切换至右侧窗口
ctrl-w ↓切换至下方窗口
ctrl-w q退出当前窗口
:sp filename分割窗口并打开文件filename
标签式式多文件编辑: vim -p filename1 filename2 同时打开两个文件

快捷键功能

1
2
3
4
5
6
7
8
:tabnew创建新标签gt,
:tabn切换至下一个标签gT
:tabp切换至上一个标签
:tabc关闭当前标签
:tabr切换至第一个标签
:tabl切换至最后一个标签
:tabm nn为数字,切换至第n个标签。默认标签编号从0开始
:tabe  filename在当前标签后打开新标签,并加载文件filename

5. 光标移动命令

在普通模式下,除键盘上的方向键外,Vim还通过众多快捷键提供了种类繁多的光标移动命令。

基本跳转,快捷键功能

1
h,j,k,l←,↓,↑,→space,backspace(空格键,回退键)向后一位/向前一位0(数字0)跳转至行首^本行第一个非空白字符$行尾
行跳转

快捷键功能

1
2
3
4
5
6
7
8
<Enter>下一行行首
+,-下移/上移一行
n+,n-(n为数字)下移/上移n行
G最后一行第一个非空字符
nG(n为数字)第n行第一个非空字符
gg第一行第一个非空字符
`.跳转至上一次修改处
`"跳转至上一次离开文件时光标所在处
句/段/块跳转

快捷键功能
%如当前光标处为括号,跳转到匹配处),(下一句/上一句句首},{下一段/上一段段首

单词跳转

快捷键功能

1
2
3
4
5
6
7
8
w下一单词
/标点处
W下一单词处
e单词词尾
/标点E单词词尾b上一单词词首
/标点B上一单词词首处
*读取光标所在处单词并跳转至此单词的下一位置
#读取光标所在处单词并跳转至此单词的上一位置
书签跳转

快捷键功能

1
2
ma(a为任意字母)标记当前位置为书签a
`a(a为任意字母)跳转至书签a处
滚屏操作

快捷键功能

1
2
3
4
5
6
ctrl-f,ctrl-b向下一页/屏(PageDown),向上一页/屏(PageUp)
ctrl-d,ctrl-u向下半页/屏, 向上半页/屏
H,M,L屏幕最上方一行/中间行/最后一行行首第一个非空字符
ctrl-e/ctrl-E向下滚屏一行,光标保持在当前行(或屏幕首行)的行首(e)/行尾(E)
ctrl-y/ctrl-Y向上滚屏一行,光标保持在当前行(或屏幕未行)的行首(y)/行尾(Y)
nz<enter>(n为数字,<enter>为回车键)将第n行显示在屏幕首行位置;如未指定n,则默认为当前行nz.(n为数字)将第n行显示在显屏幕中间位置;如未指定n,则默认为当前行nz-(n为数字)将第n行显示在屏幕最后一行位置;如未指定n,则默认为当前行
说明:

w(ord):单词,大小写的英文字母,连字符。单词的边界通常是空白符(空格/制表),标点符号,换行符等。
W(ord):广义上的单词,包括英文字母及其他可显示字符。词的边界通常是空白符,换行符等不可见字符。

6. 插入模式

从普通模式,通过i/I/a/A/o/O都可以进入插入编辑状态,不同字母进入的区别仅在于进入插入模式后的光标位置。

快捷键功能i光标位置保持不变I光标移至本行第一个非空字符处a光标后移一位A光标移至本行行尾o在当前行之下创建新行并将光标移至新行行首O在当前行之上创建新行并将光标移至新行行首ESC返回普通模式

7. 普通模式下的一般编辑

普通模式下,也可以通过快捷命令完成很多编辑操作。

快捷键功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
r替换当前光标处的一个字符,替换完成后返回普通模式
R替换当前光标处开始的字符串,
ESC键结束替换返回普通模式
J合并当前行和下一行(删除当前行结尾处换行符号)
cc,S清空当前行后进入编辑模式
cw删除当前单词后进入编辑模式
c$,C删除光标至行尾处内容后进入编辑模式
s删除光标所在处字符后进入编辑模式
S删除当前行内容后进入编辑模式
xp交换光标所在处及其后位置处字符
u撤消上一次操作
ctrl-r重复上一次操作.重复上一次命令
~变换光标所在处字符大小
g~iw变换光标所在处单词大小写
gUiw将光标所在处单词变换为大写
guiw将光标所在处单词变换为小写
>>将当前行向右缩进一列(Tab宽度)
<<减少当前行缩进(Tab宽度)
==自动缩进当前行

8. 普通模式下的复制/粘贴/删除

Vim普通模式下支持以行/词/块/字符等作单作进行复制粘贴操作。Vim中的删除,并不会直接丢弃掉删除掉的内容,而是会将这部分内容缓存在粘贴板中,可以用在随后使用,类似于其他编辑器的剪切功能。

快捷键功能

1
2
3
4
5
6
7
8
9
dd删除当前行
dw删除单词从光标当前位置起右侧部分
x删除当前字符X删除光标前一位字符
D删除光标位置起本行右侧部分
yy复制当前行
nyy(n为数字)从当前行开始起复制n行
yw复制单词光标当前位置起右侧部分
y$复制光标位置起至行尾部分内容
p将粘贴板中内容复制到光标之后;如果粘贴板中内容包含行,则复制至光标所在行之下P将粘贴板中内容复制到光标之前;如果粘贴板中内容包含行,则复制至光标所在行之上

9. 可视模式下的一些操作

可视模式与普通模式相近,但可以方便地高度选取文件的某一部分。

普通模式下,

‘v'进入可视模式;
'V'进入可视行模式,以整行为操作单位;
ctrl-v进入块可视模式,以块为操作单行;
ESC键可返回普通模式

可视模式中,内容的选取更加灵活,因此使用起来也更方便。

快捷键功能

1
2
3
4
5
6
7
8
9
10
11
12
13
o移动光标至标记区域的另一边
O移动光标至标记区域的另一端点
u,U将标记区域内容更改为小写/大写
aw标记光标所在位置处单词(以标点符号或空白符号为界)
aW标记光标所在位置处单词(包含标点符号)
ab标记光标所在位置处所在(圆)括号范围内容(包括括号)
aB标记光标所在位置处所在(花)括号范围内容(包括括号)
ib标记光标所在位置处所在(圆)括号范围内容(不包括括号)
iB标记光标所在位置处所在(花)括号范围内容(不包括括号)
>将选取内容右移(Tab)
<将选取内容左移1Tab
y复制选取内容d删除选取内容
~将选取内容大小写求反

10. 查找和替换

结合命令行模式和普通模式,可以完成各种查找和替换操作。

模式查找

快捷键功能/pattern(pattern为匹配模式)从光标位置向后查找?pattern(pattern为匹配模式)从光标位置向前查找n重复上一次查找命令N反方向执行上一次查找命令

行内字符查找,快捷键功能

1
2
3
4
fx,Fx(x为任意字符)从光标所在位置起查找本行内字符x所在的下一处(f)/上一处(F)位置
tx(x为任意字符)从光标所在位置起查找本行内字符x所在的下一处位置,如成功则将光标置于找到位置的上一个字符处
Tx(x为任意字符)从光标所在位置起查找本行内字符x所在的上一处位置,如成功则将光标置于找到位置的下一个字符处;
重复上一次fx/FX/tx/Tx操作
替换操作

快捷键功能:

1
2
3
4
5
s/old/new(old为欲替换的模式;new为要替换为的模式;替换第一个匹配处后结束
:s/old/new/g在本行范围中替换.g指明作用域为本行)在本行范围中替换
:s/old/new/gc(c:confirm)行内替换,每处替换前需要确认
:%s/old/new%表示全文范围
:m,ns/old/newm/n为数字,表示替换范围为第m行到第n行;'.'可用来表示当前行,'$'可用来表示最后一行

html基础

html 单选按钮且默认选中

1
2
<input type="radio" name="state" value="ok"checked="true" />正常
<input type="radio" name="state" value="history"/>历史 

git分布式版本控制系统

git 本地强制更新

用git pull -f,提示 You have not concluded your merge. (MERGE_HEAD exists)。

1
2
git fetch --all
git reset --hard origin/master

git fetch 只是下载远程的库的内容,不做任何的合并git reset 把HEAD指向刚刚下载的最新的版本


【GIT 基础】

GIT 使用 SHA-1哈希码(40个字符)来标识提交,同时保证本次提交后整体(一个快照)的完整性。

文件状态:

文件状态分为:未跟踪(untracked) 和已跟踪 (tracked),已跟踪又分为三种状态:已暂存(staged),已修改(modified),已提交(committed)

一般过程如下:

1
2
3
4
5
0) 用 git pull 下载远程代码库代码
1) 新建文件,该文件状态为“未跟踪”,位于工作区;
2) 用 git add a.txt 加入该文件,状态变为已跟踪的“已暂存”,位于暂存区;
3) 用 git commit a.txt -m "ha" 提交该文件,状态变为“已提交”,位于代码库(repository )
4) 用 git push 提交到远程代码库

注意:用 git status 查看目前所有文件的状态。

GIT 配置:

三种配置范围类型:

1
2
3
1)所有用户 --system,  存在 /etc/gitconfig 文件中。(对windows来说,是msysgit 的安装目录)
2)本用户 --global,   存在 ~/.gitconfig 文件中。(对windows 来说,是 C:\Documents andSettings\$USER)
3)本项目            存在 .git/config 文件中。

注意:后面的重载前面的。例如:用–global设置,可以在所有项目中使用这个设置;如果有一个项目你想使用一个特别的设置,就可以使用不带参数的git config 重新设置,则它只作用于这个项目。如果用 git config –list 查看这些设置,可能会列出多个,但最后那个起作用。

用户信息
1
2
3
4
5
6
7
8
$ git config --global user.name "John Doe"  
$ git config --global user.email  
文本编辑器  
$ git config --global core.editor vim  
查看配置信息  
$ git config --list  
或者只看一个信息:  
$ git config <key>

【常用操作】

基本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ git grep XXX                       查看某个关键字
$ git init                        初始化仓库,如果该目录有文件,则都会处于“未跟踪”状态的。
$ git clone git://github.com/schacon/grit.git mygrit  克隆仓库,并换个名字
说明: 
	通过git clone获取的远端git库,只包含了远端git库的当前工作分支。
	如果想获取其它分支信息,需要使用 “git branch –r” 来查看, 
	如果需要将远程的其它分支代码也获取过来,可以使用命令 “ git checkout -b 本地分支名 远程分支名”,
	其中,远程分支名为 “git branch –r” 所列出的分支名, 一般是诸如“origin/分支名”的样子。
	如果本地分支名已经存在, 则不需要“-b”参数。
$ git add readme.txt                  跟踪一个新文件:                                                 
说明: 
	1) 跟踪之后,该文件状态是“已暂存”的。 (Changes to be committed:)
	2) 修改一个已暂存的文件,该文件会出现在两个记录区中。
	3) 如果跟踪错了,想把他删除(不删除工作区的),则用 git rm --cachedreadme.txt。
	   状态变成“未跟踪”,如果该文件已经修改了,则加  -f参数强行删除暂存区的文件(已修改的文件不被覆盖)。
$ git commit -m "fix bug1"                提交更新

$ git diff                        查看尚未暂存的更新,比较“已修改”和“已暂存(或已提交)”。
$ git diff --cached 或 $ git diff --staged       查看尚未提交的更新,比较“已暂存”和已提交。
$ git rm -f a.a                       强行移除修改后文件(从暂存区和工作区中删除)
$ git mv file1 file2                  改名(只改工作区和暂存区)
$ git stash                       将你当前未提交到本地(和服务器)的代码推入到Git的栈中 
$ git stash apply                 将Git的栈中代码恢复
$ git commit --file notefile              从文件中取注释
$ git checkout A.java                 抛弃已修改,用已提交覆盖,此命令对已暂存文件没作用。 
$ git rm --cached A.java              移除已跟踪文件,恢复到“未跟踪”,如果文件已修改,则需-f,并且不覆盖修改过的内容。 

后悔药

1
2
3
4
5
$ git reset HEAD readme.txt              取消已暂存的文件(已暂存到已修改)
$ git reset --hard HEAD                   重置所有修改,就像没有修改过一样。
$ git reset --hard HEAD~3             最新的3次提交全部重置,就像没有提交过一样。
说明:
	--hard reset后再执行 git push origin HEAD --force 也将删除远程的提交。

历史查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
$ git show 356f6def9d3fb7f3b9032ff5aa4b9110d4cca87e  显示具体的某次的改动的修改
$ git log                     查看提交历史(全部)
$ git log --stat                  查看提交历史,并显示统计信息
$ git log -p -2                       查看最近2次提交历史并查看差异
$ git log --since=2.weeks             查看最近2周内提交历史
$ git log --since="2008-09-14"                查看某个时刻之后的提交历史
$ git log --until="2008-09-14"                查看某个时刻以前的提交历史
$ git log --author="stupid"               查看某个作者的提交历史
$ git log --pretty=oneline                列出所有改动历史
$ git log --pretty=format:"%h - %an, %ar : %s"        查看提交历史,并格式化显示
例如:
	$ git log --pretty=format:"%h - %an, %ar : %s"
	ca82a6d - Scott Chacon, 11 months ago : changed the versionnumber
	085bb3b - Scott Chacon, 11 months ago : removed unnecessary testcode
	a11bef0 - Scott Chacon, 11 months ago : first commit
 
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%cr 提交日期,按多久以前的方式显示
%s 提交说明
 
$ git log --pretty=format:"%h %s" --graph查看提交历史,并图形化显示
例如:
$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 ignore errors from SIGCHLD on trap
*  5e3ee11 Merge branch 'master' ofgit://github.com/dustin/grit
|\
| * 420eac9 Added a method for getting the current branch.
* | 30e367c timeout code and tests
* | 5a09431 add timeout protection to grit
* | e1193f8 support for heads with slashes in them
|/
* d6016bc require time for xmlschema
*  11d191e Merge branch 'defunkt' into local
 
其它:
--shortstat 只显示 --stat 中最后的行数修改添加移除统计。
--name-only 仅在提交信息后显示已修改的文件清单。
--name-status 显示新增、修改、删除的文件清单。
--abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
--relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。
--graph 显示 ASCII 图形表示的分支合并历史。
--pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和format(后跟指定格式)。

忽略某些文件——很有用

在.gitignore 文件中加入需要忽略的内容

1
2
3
4
5
*.a          # 忽略所有 .a 结尾的文件
!lib.a            # 但lib.a 除外
/TODO         # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/            # 忽略build/ 目录下的所有文件
doc/*.txt     # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

注意:.gitignore 文件放在工程的根目录即可,但是要把它用 git add 加入跟踪或者提交。

irssi

首先连接服务器,用/connect server-name

  1. /nick
    选择一个没有重名的用户。(重名会有提示)

  2. /msg nickserv register
    通过email认证后:

  3. /msg nickserv identify

使用log:
1.使用pgUP,pgDn键可以实现记录的翻页。
2./goto 12:00, /goto end
3./lastlog nickname 查看nickname所说的话!
4./away暂时离开,/away查看离开时段的聊天记录。

-------------

【日常操作】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(1) /nick <昵称> ,修改昵称
(2) /join #<频道> ,加入一个频道
(3) /wc,离开当前频道
(4) /part <频道> <消息>,退出频道,不加频道名退出当前频道,后面可以跟退出原因。
(5) /disconnect <服务器>,断开一个服务器
(6) /quit 或者 /exit,退出 irssi,结束IRC会话。
(7) /msg <昵称> <消息>,向某人发私消息(新开窗口)
(8) /query <昵称> <消息>,向某人发私消息(新开窗口且转换到这个窗口)
(9) /say <昵称> <消息>,向某人说话(不新开窗口)
(10) /notice <昵称> <消息>,向指定人发出注意消息
(11) /me <动作>,在当前聊天室窗口中做出动作。 如做出晕倒动作:/me 晕倒
(12) /away <原因>,留下信息说明暂时离开,别人向你发出私聊时将会返回此消息,再重新输入 /away(不指定参数)则解除离开状态。
(13) /ignore <昵称>,忽略某人的聊天内容
(14) /set autolog on,自动保存聊天记录

【窗口操作】

1
2
3
4
5
6
7
(1) Alt+1~0,对应1~10的频道编号
(2) Alt+q~p,对应11~20的频道编号
(3) Ctrl+n/p,切换上/下一个频道
(4) PageUP/PageDn,切换上/下页讯息
(5) /window close,关闭当前窗口
(6) /window close <数字>,关闭指定编号的窗口
(7) /window list,窗口列表

【查询信息】

1
2
3
4
5
6
7
8
9
10
(1) /list,频道列表
(2) /names [#聊天室],列出当前服务器或指定聊天室下的所有人员名称(无法列出隐藏人员)
(3) /who,查看频道的所有人
(4) /whois [昵称],查看某人的基本资料
(5) /ison <别名1> <别名2> ...查询指定别名是否在线
(6) /info,查询服务器信息
(7) /admin,查询当前服务器上的Admin
(8) /lusers,查询当前服务器上的统计信息
(9) /motd,查询当前服务器今日的统计信息
(10) /links,查询当前的服务器,解析当前的有几个服务器。

【提示信息】

[Act: 1,3,6,9,10]:这些数字提示各个频道上对话情况:[灰白色] 表示有人登录或登出,[白色] 代表有人在此channel上说话,[灰红色] 代表对话中提起你的名字或呼叫你。

【转换编码】

/recode add #<频道> <编码>,加入此频道编码格式
/recode,查看加入的编码列表

screen

vim .screenrc

1
2
3
4
5
6
7
8
9
deflogin off
startup_message off
defscrollback 100000

caption always "%H %c | %3n %t%? @%u%?%? [%h]%?%=%c"
hardstatus alwayslastline '%{bW}%-w%{.wB}%n %t%{-}%+w %=%{.w}'

screen -t bash
screen -t bash

vim .bashrc

1
2
export LANG=en_US.UTF-8  # 有些终端会初始化出 LANG=c
export TERM=linux # screen 的bash默认 TERM=screen,标签的标题就会随 /etc/bashrc 里的变化

断开控制台而不结束会话-Screen

设想一下,你通过 ssh 连接到了一台服务器,接着你开始编译一个软件。这或许要占用你一个小时甚至更多的时间,突然!你需要离开,或者是断开网络了~
怎么办?下次再重新编译一次么?还有例外一种办法~(当然,我指的不是一开始放在后台运行。)
Screen!

一、启动 Screen

下载配置文件screenrc,放到~/.screenrc,注意要加一个.号。然后启动 Screen 再简单不过了,在 Shell 中运行 screen ,按回车,就进入 Screen 输入环境了。

二、给 Screen 的指令

和VIM类似,当你想给 Screen 发送指令,而不是给 shell 输入指令的时候需要用到特定的组合键:Ctrl-A 。(这类似于 VIM 中的 ESC。)当你执行Ctrl-A 后就可以引起 Screen 的注意了。

三、我在 Screen 中么?

通过 screen -list 调用 screen 可以看到类似如下界面:
这标明你正处于 Screen 中。并且进程号是8941。

四、还有哪些命令?

通过 Ctrl-A and ? 的方式你可以看到如下列表:
ok!一切都明了了!

五、离开

这时我需要离开那台正在编译软件的主机了,通过 Ctrl+A and D。我们脱离了 screen。但是 screen 依然在后台运行着。

六、归来

当你回到这台主机,并想重新进入之前的 screen 时,以前看到的 进程号(PID)就要发挥作用了。
通过命令:
screen -r pid
就可以回到之前的Screen了。
如果你觉得记住 PID 是一件很麻烦的事情,也可以使用 -S 参数:
scree -S latteye
这样就可以打开一个名为 latteye 的会话,下次连接时使用:
screen -r latteye
即可。

七、特殊情况

有些时候我们离开 screen 并不是那么正常,不一定会按 Ctrl-a + D 来离开 Screen,比如网络突然断开的时候。
这个时候,若我们重新回到主机,则通过 -r 参数是无法连接 screen 的,我们还需要 -d 的帮助:
screen -d -r pid


命令其实超简单的:
直接在终端上输入 screen , 这个时候,服务器端会启一个新的终端,但这个终端,与之前的普通终端不一样,它不隶属于 sshd 进程组,这样,当本地终端关闭后,服务器终端不会被 kill。
当然,优点还不止这么些,在服务器终端里执行任务时,你甚至可以随时地切换到本地终端做些其他事情,然后,要回去时,再恢复到刚才已经打开的服务器终端里,如果刚才的任务没有结束,还可以继续执行任务。
操作步骤:
首先,进入 screen -S sessionname终端。(sessionname是为了区分你的session)
然后按 ctrl + a,再按 d键暂时退出终端。
当要返回时, 先查看刚才的终端进程ID, screen -list
或直接
screen -r xx(刚才的sessionname)就可以了
当然,当你开了很多个session后,打算关闭几个session,可以进入到session后,exit一下就可以了.

1
2
3
4
5
6
7
8
9
10
11
12
13
Ctrl + a + ?            显示所有键绑定信息
Ctrl + a + w            显示所有窗口列表
Ctrl + a + a            切换到之前显示的窗口
Ctrl + a + c            创建一个新的运行shell的窗口并切换到该窗口
Ctrl + a + n            切换到下一个窗口
Ctrl + a + p            切换到前一个窗口(与C-a n相对)
Ctrl + a + 0..9         切换到窗口0..9
Ctrl + a + " + 0..99    切换到窗口0..99,用于超过9个窗口的切换
Ctrl + a + a            发送 C-a到当前窗口
Ctrl + a + d            暂时断开screen会话
Ctrl + a + k            杀掉当前窗口
Ctrl + a + [ OR Esc     进入拷贝/回滚模式,Space 第一次按为标记copy区起点,第二次按为终点
Ctrl + a + ]            把刚刚在 copy mode 选定的内容贴上