引言:研究生涯必不可少的能力之一就是使用Linux语言和Git的使用,很早就想系统学习这方面相关知识,奈何时间安排不当,加上自己的懒惰,每次都是现用现翻,没有形成固定的框架和理解,导致这次用了下次忘。但是太深的课程不适合我这样的小白投入精力看,太细的讲解有的也用不到。此种情况下,我向身边大佬请教,找到了一些很适合研究生学习的资料,并狠下心研究,把相关笔记心得记录下来,笔记中多会记录一些常用命令,希望帮到更多和我一样这方面不大行的难兄难(弟),啊不是,研友盆友。(本教程默认本地环境为MAC OS)
再次声明:本教程适合Linux似懂非懂的小白,不适合中高级学习者。也希望各位大佬看到愿意提出宝贵意见,谢谢!
如今的计算机有着多种多样的交互接口让我们可以进行指令的的输入,从图像用户界面(GUI),语音输入甚至是 AR/VR 都已经无处不在。 然而在计算机的早期并没有图形界面,人们只能通过命令行来控制计算机。
由于用户不能直接接触内核,需要另外再开发一个程序,让用户直接使用。其作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,这样用户就能间接地使用操作系统内核了。
用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做 Shell。
Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。
$ date
2022年 3月22日 星期二 21时39分58秒 CST
shell 中的路径是一组被分割的目录,在 Linux 和 macOS 上使用 / 分割,而在Windows上是 \。
$ ls
Applications Users cores home
$ cd ./Users
$ pwd
/Users
$ ls
Applications Users cores home
$ cd Users
$ pwd
/Users
# 此时,cd ./Users和cd Users 一样
-h 或 --help 标记可以打印帮助信息,-l 参数可以打印出更加详细地列出目录下文件或文件夹的信息。首先,“drwxrwxrwt……” 那行第一个字符 d 表示 root 是一个目录。然后接下来的九个字符,每三个字符构成一组。 (rwx). 它们分别代表了文件所有者(sugege),用户组(users) 以及其他所有人具有的权限。其中 - 表示该用户不具备相应的权限。
$ ls -l ./Users
total 0
drwxrwxrwt 5 root wheel 160 3 17 2021 Shared
drwxr-xr-x+ 61 sugege staff 1952 3 22 22:01 suxinyan
注意,这里root根用户几乎不受任何限制,他可以创建、读取、更新和删除系统中的任何文件。 通常在我们并不会以根用户的身份直接登录系统,因为这样可能会因为某些错误的操作而破坏系统。 取而代之的是我们会在需要的时候使用 sudo 命令[1]。
当程序尝试读取信息时,它们会从输入流中进行读取,当程序打印信息时,它们会将信息输出到输出流中。通常,键盘作为输入,显示器作为输出。
本节主要介绍shell中最流行的 bash 脚本,要注意使用的时候和常用编程语言的区别之一:在shell脚本中使用空格会起到分割参数的作用,有时候可能会造成混淆,请务必多加检查。
Bash中的字符串通过’ 和 "分隔符来定义,但是它们的含义并不相同。以’定义的字符串为原义字符串,其中的变量不会被转义,而 "定义的字符串会将变量值进行替换。
$ suge=girl
$ echo '$suge'
$suge
$ echo "$suge"
girl
bash也支持if, case, while
和 for
这些控制流关键字。同样地, bash 也支持函数,它可以接受参数并基于参数进行操作。通常$1
是脚本的第一个参数。bash使用了很多特殊的变量来表示参数、错误代码和相关变量。下面是列举:
$0
- 脚本名$1
到 $9
- 脚本的参数。 $1
是第一个参数,依此类推$@
- 所有参数$#
- 参数个数$?
- 前一个命令的返回值$$
- 当前脚本的进程识别码另一个常见的模式是以变量的形式获取一个命令的输出,这可以通过 命令替换(command substitution)实现。
$ echo "Starting program at $(date)" # date会被替换成日期和时间
find (语法比较难以记忆)
总结比较好的博文:Linux find命令
# 查找所有名称为src的文件夹(.表示查找位置)
find . -name src -type d
# 查找所有文件夹路径中包含test的python文件
find . -path '*/test/*.py' -type f
# 查找前一天修改的所有文件
find . -mtime -1
# 查找所有大小在500k至10M的tar.gz文件
find . -size +500k -size -10M -name '*.tar.gz'
grep: 查找代码
$ grep "被查找的字符串" 文件名
#从文件内容查找匹配指定字符串的行
$ grep –i "被查找的字符串" 文件名
#查找时不区分大小写
$ grep -c "type" main.py
#查找匹配的行数(c小写)
$ grep -C 5 "config.K_Fold=kfold" main.py
#输出匹配结果前后五行。
Vim有着悠久历史;它始于1976年的Vi编辑器,到现在还在不断开发中。即使你最后使用其他编辑器,Vim也值得学习。本节仅介绍Vim基础知识。
在默认设置下,Vim会在左下角显示当前的模式。 按下
(退出键) 从任何其他模式返回正常模式。
在正常模式:
键入 i
进入插入模式
R
进入替换模式
可视化模式
v
进入可视(一般)模式
V
进入可视(行)模式,
(Ctrl-V, 有时也写作 ^V)进入可视(块)模式,
:
进入命令模式
在键入 :
后,你的光标会立即跳到屏幕下方的命令行。 这个模式有很多功能,包括打开,保存,关闭文件,以及退出 Vim。
:q
退出(关闭窗口)
:w
保存(写)
:wq
保存然后退出
:e {文件名}
打开要编辑的文件
:ls
显示打开的缓存
:help {标题}
打开帮助文档
:help :w
打开 :w 命令的帮助文档
:help w
打开 w 移动的帮助文档
正常模式可使用命令
hjkl
(左, 下, 上, 右)3w
向前移动三个词5j
向下移动5行7dw
删除光标所在词及后方共7个词w
(下一个词), b
(词初), e
(词尾)0
(行初), $
(行尾)H
(屏幕首行), M
(屏幕中间), L
(屏幕底部)Ctrl-u
(上翻), Ctrl-d
(下翻)gg
(文件头), G
(文件尾){行数}
或者 {行数}G
({行数}为行数)f{字符}, t{字符}, F{字符}, T{字符}
;
用于导航匹配/{正则表达式}
, 然后回车开始全文查找,n / N
用于前后导航匹配,r+字符
会进行光标当前位置字符替换O / o
在之上/之下插入行dw
删除光标所在词, d$
删除到行尾, d0
删除到行头。cw
改变词,比如 d{移动命令} 再 ix
删除字符(等同于 dl)s
替换字符(等同于 xi)u
撤销, 重做y
复制 / “yank” (其他一些命令比如 d 也会复制)p
粘贴正则表达式通常以(尽管并不总是) /
开始和结束。常见模式:
.
除换行符之外的”任意单个字符”*
匹配前面字符零次或多次+
匹配前面字符一次或多次[abc]
匹配 a, b 和 c 中的任意一个(RX1|RX2)
任何能够匹配RX1 或 RX2的结果^
行首$
行尾有能力者建议自行研究:
sed
, awk
,sort
,
Q1:vi 和 vim是一个东西吗?
A1:不是!如果配置vim的一些环境,要注意对vi是不适用的,介意的人可以(用alias)处理一下
Q2:配置路径和一些环境变量后,保存了脚本文件再次重启服务器不生效怎么办?
A2:输入source ~/.bashrc
or source ~/.zshrc
,source:使当前shell读入路径为filepath的shell文件并依次执行文件中的所有语句,通常用于重新执行刚修改的初始化文件,使之立即生效
Q3: 第一次登录服务器发现Tab键失效、上下左右箭头出现乱码
A3:这个我一开始看CSDN各种教程,说的都不是主要原因,不能解决问题!!!!!!,believe me,输入这条命令,解决百分之80问题(改bash还是zsh看自己喜好)
chsh -s $(which bash)
Note:
不管何种情况,请绝对信任Linux系统,出现环境问题,第一时间看配置文件或者日志文件,只要不是天大的问题,都可以解决。
[1] MIT shell 课程
[2] GIt 飞行笔记
[3] 跟廖雪峰学Git
[4] Git book
[5]shell 开胃菜