Linux 使用技巧总结

Linux 使用技巧总结

(noilinux or ubuntu 22.04)
结合高中时用 linux 的一些技巧,并加入一些大学以后用到的 linux 常识。

终端的基本命令

Linux Command Line Sheet
忘了就 -h--helpman

#pwd cd ls mkdir find, find:在层级下搜索目录
size filename  
sudo apt update
sudo apt-get install firefox
sudo apt install --only -upgrade firefox
#换源(清华源https://mirror.tuna.tsinghua.edu.cn)更快


cp filea fileb
cat filename
#Win对应 type filename
rm filename
mv filea fileb
mv file noi/
cp file noi/
diff filea fileb -w #ignore行末空格文末回车
vimdiff filea fileb

pkill gedit
pkill gedit -9
xdg-open filename #(X Desktop Group)open a file(including .pdf, .jpg, .png, ...)
#Win对应 start filename 或者 explorer filename

cpp相关

编译命令:g++ filename.cpp -O2 -Wall -Wl,--stack=112345678 -fsanitize=address -std=c++11 -fsanitize=undefined -ftrapv -g,其中-fsanitize=address检查内存泄漏,找到 #0 0x80488e2 这样的16进制数后 addr2line 0x80488e2 -e ./test 就能获取行号,ftrapv 检查爆int or longlong。注意不 -o filename 自动生成到 a.out
make b : 自动执行 g++ b.cpp -o b

nl a.cpp #display a.cpp, including number of lines
./c > outputfile
./c < inputfile
vimdiff a b
#对拍
mkdir checker
cd checker/
vim a.cpp
vim b.cpp
vim maker.cpp
vim checker.cpp
make a
make b
make maker
make checker
  • gdb 调试:
g++ a.cpp -o a -g
gdb a
b 6 #在第6行加断点
r #run
p a #print a
p a+b #print a+b
q #quit
  • 写 Makefile : vim Makefilevim makefile
a : a.cpp
    g++ a.cpp -o a -Wall -std=c++11

\(a\) 依赖于 a.cpp

以后就可以 make a 了。(如果没有 Makefile 默认 g++ a.cpp -o a

更一般的makefile格式:

<target> : <prerequisites>
[tab]	commands

更多的例子:

result.txt: source.txt
	cp source.txt result.txt
source.txt:
	echo "this is the source" > source.txt
var-kept:
    export foo=bar; \
    echo "foo=[$$foo]"
%.o: %.c
txt = Hello World
test:
	@#This is a test.
	#A line is a process.
	#'@' means cancle the echo of makefile
	@echo $(txt)
a.txt b.txt: 
	touch $@
dest/%.txt: src/%.txt
	@[ -d dest ] || mkdir dest
	cp $< $@
	
.PHONY: cleanall cleanobj cleandiff
cleanall : cleanobj cleandiff
	rm program
cleanobj :
	rm *.o
cleandiff :
	rm *.diff

注意makefile里面写 $ 需要打两个( $$ )来表示,否则会被转义。教程

  • time

time ./a : 会显示 real ...s user ...s sys ...s,其中 real 是运行时间(不要标准输入)。
也可 \time -f "%U %M" ./test(-format "User time, Memory(KB)"),user time 不计IO等待时间。但可能需要安装 \time

  • 多命令行:Ctrl shift T 新建,Ctrl Pageup/Pagedown 切换
  • 开栈:ulimit -a 获取信息(stack size是栈大小,单位KB);ulimit -s 102400:开100MB的系统栈;help ulimit for help.
  • Language:有的 Linux 是可以敲中文的,按 shift 键即可。但是好像只有键盘左边的那个shift管用。如果不能,可以按照 guide 安装。(2024.1.21 upd. 已关闭中文默认系统语言。若要开启:double Win 打开搜索界面,language 语言选项,语言支持中把灰色的“汉语(中文)”拖到最上面,点击“应用到整个系统”,重启即可)

vim相关

oi wiki : Vim
或者直接在终端里敲打开 vimtutor 就有教学。

各种模式

默认普通模式,按 v 进入可视模式,按 i 进入插入模式。
: 会出现单行模式,相当于一个小型的命令行界面。

一些快捷键

普通模式下按 G (大写)跳至行末,然后按 v 进入可视模式,然后按 gg 跳至开头,就可以实现“全选”操作了。

vim中复制粘贴时缩进混乱的解决方法

首先把光标搞到最左上角,然后按Ctrl VG(大写),=,就好了。

.vimrc

方法:在 ~ 目录下建立一个 .vimrc 文件。可以直接在终端敲 vim .vimrc

set tabstop=4
set shiftwidth=4
set autoindent
autocmd FileType cpp set cindent
autocmd FileType c set cindent
set ruler
set nu
set mouse=a

autocmd FileType cpp nmap<F8> : !g++ % -o %<
autocmd FileType cpp nmap<F9> : call Compile_cpp() <CR>
func! Compile_cpp()
    exec "w"
    exec "!clear"
    exec "!g++ % -o %< -fsanitize=address -ftrapv -Wall -g"
endfunc
autocmd FileType cpp nmap<F12> : call Execute_cpp() <CR>
func! Execute_cpp()
    exec '!\time ./%<'
endfunc


autocmd FileType c nmap<F8> : !gcc % -o %<
autocmd FileType c nmap<F9> : call Compile_c() <CR>
func! Compile_c()
    exec "w"
    exec "!clear"
    exec "!gcc % -o %<"
endfunc
autocmd FileType c nmap<F12> : call Execute_c() <CR>
func! Execute_c()
    exec '!\time ./%<'
endfunc

autocmd FileType sh nmap<F9> : call Execute_sh() <CR>
func! Execute_sh()
    exec "w"
    exec "!clear"
    exec "!./%"
endfunc
nmap<F9> : !python3 %

所有这些配置均可在普通模式下的“命令行”中直接输入,只会生效一次。

vim 小技巧

复制粘贴:在 vim 里面的复制粘贴直接用 y 和 p 就好,用法见上面的 vimtutor;如果想要复制粘贴到 vim 外面,可以手动用鼠标拖拽出想要复制的区域,Ctrl + shift + c。可能需要先Ctrl--,需要有一定的眼力;也可以 :!cat %,也可以 :!gedit %&

关于 vim 的分屏:如果直接用:sp a.cpp 的话,会分成上下两个屏幕,与平时习惯不符。使用 :vs a.cpp 可以方便地分成左右两个屏幕。

输入 :set mouse=a 即可使用鼠标;输入 :set mouse= 即可关闭鼠标(从而可以复制粘贴)

vim 查找替换:

vim substitute

目前使用的 .vimrc

(单引号忽略特殊字符)

set tabstop=4
set shiftwidth=4
set autoindent
autocmd FileType cpp set cindent
set ruler
set nu
set mouse=a

autocmd FileType cpp nmap<F8> : !g++ % -o %<
autocmd FileType cpp nmap<F9> : call Compile_cpp() <CR>
func! Compile_cpp()
    exec "w"
    exec "!clear"
    exec "!g++ % -o %< -fsanitize=address -ftrapv -Wall -g"
endfunc
autocmd FileType cpp nmap<F12> : call Execute_cpp() <CR>
func! Execute_cpp()
    exec '!\time ./%<'
endfunc


autocmd FileType c nmap<F8> : !gcc % -o %<
autocmd FileType c nmap<F9> : call Compile_c() <CR>
func! Compile_c()
    exec "w"
    exec "!clear"
    exec "!gcc % -o %<"
endfunc
autocmd FileType c nmap<F12> : call Execute_c() <CR>
func! Execute_c()
    exec '!\time ./%<'
endfunc

autocmd FileType sh nmap<F9> : call Execute_sh() <CR>
func! Execute_sh()
    exec "w"
    exec "!clear"
    exec "!./%"
endfunc
nmap<F9> : !python3 %

linux文件系统

/ 根;~:home, default is /home/username or root
., ..

根目录/下:
bin:放最基本命令 ls
boot:启动linux相关
dev:(device)存放外部设备,常见有 null(返回EOF数据), zero(return 0), urandom(返回随机数据),可能有nvidia等
etc:(et cetera)系统管理所需配置文件,如passwd(放用户信息),shadow(放用户加密的密码信息)
home:
lib:(library)动态链接库
media, mnt: 外部设备挂载点
proc:(processes)放一系列存储内核运行状态的文件
root:
srv:(services)服务器相关
tmp:临时文件,重启清空
usr:(unix software resource)放用户程序和文件,如bin,sbin,local
var:(variable)放系统运行需要改变的数据,如log,chache,数据库文件等。

whoami命令:当前用户是谁

文件权限
ls -l显示目录下各文件的权限,例如:
drwxrwxr-x 2 training training 4096 7月 11 22:31 folder
或者
-rw-rw-r-- 1 training training 0 7月 11 20:16 hello.txt
字符串分别u(ser),g(roup),a(ll)。每个是r(ead),w(rite),x(execute),rwx可转化成二进制r4w2x1。
chmod修改权限,如chmod 755 script.sh #除user外不可写,也可以chmod (u|g|o|a)(+|-|=)(r|w|x) file,如chmod u+x script.sh 增加可执行权限。

Shell命令

GUI图形界面,CLI命令行界面。
shell:软件,解析输入到命令行的指令,调用内核提供的服务。Mac 默认 zsh,Win默认PowerShell,Ubuntu默认bash。检测当前Shell:echo $0

command example:echo 1 && echo 2, echo 1 || echo 2,分别输出12和1,因为命令顺利完成会 return 0,且shell有短路求值特点。

<>重定向,>>追加,|连接前后两个程序的输入输出,如ls /usr/bin | python,其中 grep 命令即筛选命令,筛选所有带 python 的文件名。一个 linux 使用小技巧:find查找文件find . -name *.txt grep全文搜索grep -r local_rank * string二进制文件全文搜索

.bashrc:Bash的配置文件,放在/下,打开Bash时执行。/.bashrc 中可以设置环境变量、别名、函数等。example:alias la='ls -A' (别名)。设置后重启生效。

环境变量PATH:当我们在终端中输入一个命令时,Shell 会在环境变量 PATH 指定的目录中寻找。查看所有PATH:echo ${PATH}(会以冒号:隔开)。查看某个命令的路径:which <cmd>,如which python3,返回 /usr/bin/python3

参数传递

获取参数值:
$0 : 固定,代表执行的文件名
$1 : 代表传入的第1个参数
$n : 代表传入的第n个参数


\$#:参数个数
\$*: 以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数
\$@:与$*相同,但是使用时加引号,并在引号中返回每个参数。
\$\$:脚本运行的当前进程号
\$!:后台运行的最后一个进程的ID
\$?: 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
\$* 与 $@ 区别
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

玩转shell-那些反人类的括号使用规则大汇总!
一篇教会你写90%的shell脚本

复杂脚本尽量转python!

SSH(Secure Shell)

用于远程连接(通常是连接服务器,但虚拟机装了openssh serversudo apt install openssh-server 后也可以连接)
.ssh文件:(通常在用户文件夹下)注意到该文件夹下可能会有 id_ed25519,id_ed25519.pub 文件,代表私钥和公钥。还可能会有 known_hosts 存储连接过的服务器,再次连接时无需输入服务器密码。还可能会有 authorized_keys 存储授权登录的用户的公钥,该用户登录时无需输入服务器密码。
ssh key 生成:使用ssh-keygen命令生成 ssh key。最常用的加密方式为 ed25519,此外还有rsa等。于是可以输入命令 ssh-keygen -t ed25519 来指定加密方式。passphrase 指使用 ssh key 时需要输入的密码,一般设置为空即可。
服务器 ssh 配置与本地连接:(以linux虚拟机为例)需要在虚拟机上装openssh-server,然后就可以在本地连接了。本地连接命令为 ssh jzp@192.168.***.***,其中jzp为服务器名称(即jzp@jzp-virtual-machine前面部分),192.168.....为虚拟机IP,可以在虚拟机中使用命令 ip a 查询,除了 127.0.0.1 以外的另一个就是。(windows可以用 ipconfig 查询,看 IPv4 Address)
本地连接的两种方式:一种是用服务器密码连接,一种是将本地公钥传给服务器让服务器加到 authorized_keys 里面。(github只支持第二种)(好像要求当前目录到~的权限都是700,authorized_keys 的权限是 600)
scp远程复制文件:(scp之前不用ssh连接上,直接在本地即可)使用命令 scp <from> <to> 可将from复制到to,例如(在本地)scp jzp.cpp jzp@192.168.184.129:~/jzp.cpp 将当前文件夹下的 jzp.cpp 复制到服务器上的~/jzp.cpp位置,或者scp jzp@192.168.184.129:~/note . 如果需要复制文件夹,则需要在前面加上 -r 的flag:scp -r jzpdir jzp@192.168.184.129:~/;如果要限定端口的话可以写:scp -r -P 22222 corountinelab/ ics-2022012385@166.111.68.163:~/
ssh配置文件(/.ssh/config):(教程科协文档教程)。一个简单的 config 文件:

HOST sast
    HostName 152.136.177.53
    Port 8000     (默认22,此时不需要指定)
    User root

这样每次我们想连接到 root@152.136.177.53 -p 8000 时只需要输入 ssh sast 即可。同样适用于 scp

APT(Advanced package tool)

Tmux

简要教程

需要安装。优点在于可以分离当前终端会话并在将来重新连接。
在一个命令行里面输入 tmux 就可以打开一个新的tmux session(默认命名为编号)(注意会话session,窗口windows,面板pane的区别)
此外可以在命令行使用命令tmux ls 查看所有session;tmux new -s NAME 创建一个名称为NAME的新session;tmux a [-t NAME] 重连session;
Ctrl-B为默认的快捷键全局命令,按下之后才可以输入快捷键。常见快捷键有 %(左右分屏),"(上下分屏),上下左右箭头(焦点面板切换),ddetach,zzoom(当前面板全屏),c新建窗口,,命名窗口,w列出所有窗口;N跳转到第N个窗口,p前一个n后一个,s列出所有session

配置文件:~/.tmux.conf

set -g prefix C-a
unbind C-b
bind C-a send-prefix

unbind '"'
bind - splitw -v -c '#{pane_current_path}'
unbind '%'
bind | splitw -h -c '#{pane_current_path}'

set-option -g mouse on

bind -r k select-pane -U
bind -r j select-pane -D
bind -r h select-pane -L
bind -r l select-pane -R

bind -r ^k resizep -U 5
bind -r ^j resizep -D 5
bind -r ^h resizep -L 5
bind -r ^l resizep -R 5

set -g default-terminal "tmux-256color"

tmux -V 查看tmux版本;shift+鼠标拖动可以选择复制
TMUX复制模式怎么使啊??!

1. 按下三个按键进入文本复制模式
    CTRL + b + [
2. 按下两个按键进入文本开始复制的起始位置

    CTRL + 空格

3. 上下左右键选择要复制的文本

4. 选中了要复制的文本后,按下两个按键,将文本保存到tmux的buffer中

    ALT + w 
5. 按下三个按键将文本粘贴到某处

    CTRL + b + ]

6. 按 q 退出复制模式

Git

工作区workspace暂存区staging area版本库local repository

基本操作

git --help #best way to review in a short time
git config --global user.name "jcp22" #change user name to "jcp22"
git config --global user.email "jcp22@mails.tsinghua.edu.cn" #change user's email to "..."


git init git-test
git status #show the files that not added(or not committed)
git add * #add all files
git commit -m "I've modified ..." #commit with message("I've...")

# HEAD(in your computer); master(the main branch); truck
git branch #show current branch
git branch March26 #create a new branch
git switch March26 #switch branch to March26
git merge March26 #add files from branch "March26" to current position(branch)
git branch -d March26 #delete a merged branch(-D for unmerged branch)

git log #show modify log
git log --graph --oneline --all #show the log more human readably

git checkout ec723b2 ./
git reset --hard ec723b2 #change HEAD to version ec723b2(hash)

注意本地会随着 branch 的 switch 而变化。

关联远程仓库:(SSH方法)
远程仓库:类似github,gitlab(THU)

配置密钥ls ~/.ssh 里面查看是否已经有密钥(如 ed25519),如果没有就 ssh-keygen -t ed25519 -a 100 生成密钥。
然后复制 ed25519.pub 中的公钥,粘到github/gitlab的settings/SSH Keys中。
将一个本地的git仓库关联上远程仓库git remote add <name> <url>,其中远程仓库名 name 通常为 origin,url为仓库url,如:git@github.com:jiazp/hello-git.git
推送 git push -u origin master(-u 远程;master 是一个分支)(git push -u 似乎可以自动将 origin 推送到 master)
获取:先检查更新 git remote update,再获取到本地 git pull。还有种操作是 git fetch,它和 git pull 的区别:

git fetch updates your remote-tracking branches under refs/remotes/<remote>/.
This operation is safe to run at any time
since it never changes any of your local branches under refs/heads.

git pull brings a local branch up-to-date with its remote version,
while also updating your other remote-tracking branches.

查看远程仓库其他分支git branch [-r|--remote] 或者和本地的一起显示:git branch [-a|--all]
删除远程仓库分支git push -d origin <branch>
更多有关 Remote Branches:可以使用 git ls-remote <remote>git remote show <remote> 来获取 remote branches 信息,其中 <remote> 是远程仓库的“名字”,通常为 origin。很不错的文档,图文并茂,例子丰富,兼讲原理。

克隆仓库git clone <url>,会自动关联远程仓库(origin)

tag:项目做的很大的时候可能会用到tag,表示不同版本。不过clone下来的大项目经常涉及到tag。git taggit tag -l 查看所有tag;git tag -a v0.3 -m "blabla" 创建tag;git show 显示当前 tag 详细信息;git show v1.1 显示指定的 v1.1 tag 的信息。

stash:需要暂时存储当前修改但不 commit 的一种选择吧。git stash 命令。先 git add *,然后 git stash -m "blabla" (或者 git stash save 'blabla')存下来当前暂存区(staging area)内容。这时候工作区和暂存区就清空了,我们可以checkout到别的版本下干活。之后 git stash pop 取出最近一次储藏的结果并弹栈。多次储藏可以 git stash list 查看储藏记录列表;git stash apply stash@{index} 取出储藏;git stash drop stash@{index} 删除储藏。

github 的 Fork:把仓库复制成自己的一个仓库,然后就可以在上面搞事情了。比如正常人要给 NVIDIA 或 Microsoft 的 github 上pull东西是不允许的,一般都是 Fork 然后 Pullrequest。

.gitignoregithub doc. must in your repository's root directory. example:

*.log
*.sql
*.sqlite

这样会自动忽略这三类文件。

patch:patch意为“补丁”,当我们对项目做了一点小修改后,可以生成一个仅包含修改信息的 .patch 文件,然后 email 给管理者让他打上 patch。使用方法:(首先要 fork 后 clone 之类的)首先 checkout 到要做修改的 commit 版本,然后进行一些修改,然后 git format-patch -l edd9....3d97b,其中 -1 意思应该是生成和前面一个版本的比对 .patch 文件,这样会得到一个 .patch 文件。有了这个文件就可以让别人在对应 commit 版本(可能只要不冲突的版本就行)下 git apply xx.patch 就能修改。详见下图

patch

Proxy, 端口转发, ladder relative(仍需了解学习相关常识)

p=搞研究, q=fq, r=违法, ((p->q) ^ (q->r)) -> (p->r)

一些基于 Linux 的小工具

thu-cloud-dl:打包下载清华云盘的文件夹

tldrsudo apt install tldr,然后 tldr -u 加载,完事以后就可以 tldr <command> 查命令的简短版 manual 了。(如果说 /home/train/.local/share/tldr: createDirectory: does not exist (No such file or directory) 那就建一个 /home/train/.local/share/tldr,tldr会把 github 上面的东西 clone 进这个文件里面)

fish:更 friendly 的 shell: fish(friendly interface shell),更好使些。设置 fish 为默认 shell:chsh -s /usr/bin/fish。使用 bash 命令打开 bash。

wget, curl:向网站发送、接收信息。
xdg-open: 打开各种文件

posted @ 2023-03-19 21:12  JiaZP  阅读(74)  评论(0编辑  收藏  举报