shell
# 逻辑关系算术
a=5
b=10
c=1
a=$((a*2/5+1))
if [ ! $a -lt $b -a $a -gt $c ];then
echo "$a"
print "%d\n" $a
fi
## :string
[ $s1 = $s2 ]
[ $s1 != $s2 ]
[ -z $s1 ]
[ -n "$s1" ]
## :file
[ -f/d/L/b/c/p/S/r/w/x/u/g/k/e/s file ]
## :array
array="go,to,where"
IFS=','
set -- $arrstr
IFS=' '
for x in $@;do
done
## :掐头去尾替换
replace=#
# 选择循环跳转
if [ -f file ];then
echo "file"
elif [ -d dir ];then
echo "dir"
else
echo "other"
fi
case $x in
1) echo "1";;
2|3) echo "2";;
*) echo "x";;
esac
for var in "hello world to shell";do
echo "$var"
done
while/until [];do
echo x
done
# 函数
myfun () {
echo "$1 $2 $3"
echo "$*"
echo "$@"
}
myfun 1 2 3
gdb tips
gdb [OPTIONS] [program [procID or progfile core]] gdb -p pid
info threads
thread id
#只有当前被调试线程会执行|默认全部执行|当next or step时同on,continue-until-finish等大跳转则全部运行,此时遇到断点(包括另一线程处的断点)则切换为当前线程
set scheduler-locking on|off|step
#默认,fork之后父子独立://默认追踪父进程//追踪子进程
detach-on-fork on;follow-fork-mode parent
detach-on-fork on;follow-fork-mode child
#fork之后block在该位置://默认追踪父进程,子进程block在fork位置//追踪子进程,父进程block在fork位置
detach-on-fork off;follow-fork-mode parent
detach-on-fork off;follow-fork-mode child
#汇编
disas[semble]
valgrind内存泄漏分析
valgrind ./app
perf性能热点分析
perf stat -p pid
sed
# 执行文件的第5行命令
sed -n '5p' cmd |bash
# 批量查找替换文件内容
sed -i 's/LD_LIBRARY_PATH=./LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH/g' *.sh
gcc/g++
https://www.runoob.com/w3cnote/gcc-parameter-detail.html
# 同时链接动态库(默认)和静态库
g++ -Wl,-Bstatic -L. -lx -Wl,-Bdynamic -L. -ly
# 生成intel汇编语法
cc -S -masm=intel add.c
# Optimization
-O0:不优化
-O/-O1/-Og:等价表示,g在1基础上增强debug
-O2/-Os/-Oz:s和z进一步在2基础上优化大小
-O3/-Ofast:fast在3基础上优化速度
- 编译时链接库需要分为两类:
- 直接引用:被源码中直接调用的库
- 间接引用:被调用库的依赖库
- -lxxx: 指定具体的库名称,编译时需要显式指定直接引用的库名称
- -L: 指定链接库的位置,编译时需要显式指定直接引用的库位置
- -Wl,-rpath-link: 用于编译时指定间接引用的库位置
如果知道所有间接引用的库文件名称,并且不嫌麻烦,也可以用-lxxx显式指定每一个库(不推荐-lxxx) - -Wl,-rpath: 有两个作用
- 用于编译时指定间接引用的库位置,作用同-Wl,-rpath-link
- 用于运行时指定所有引用库的位置,作用同修改环境变量(LD_LIBRARY_PATH),并且库路径引用优先级高于LD_LIBRARY_PATH
- 使用建议
- 编译命令中使用-Wl,-rpath-link 指定间接引用库位置(编译时),使用-Wl,-rpath 指定引用库位置(运行时)
- -Wl,-rpath-link 在 -Wl,-rpath 前
快捷拷贝程序依赖的动态库
ldd app |awk '{print $3}' |xargs -i cp -L {} mdir/
ssh
# 生成.ssh/id_rsa.pub 并且远程添加公钥
ssh-keygen -t rsa -C "lets2rs@126.com"
cat .ssh/id_rsa.pub | ssh root@47.106.171.40 "cat - >>~/.ssh/authorized_keys"
# ssh代理连接
ssh -v -i id_rsa -oProxyCommand="ssh -i id_rsa yh@35.75.184.13 -p 10022 -N -W %h:%p" yh@10.64.4.45
# ssh免(输入)密码连接
sshpass -p BoyuUbuntu ssh boyu@192.168.0.20
远程拷贝
scp dlib.tar.xz cat@119.27.182.173:/home/cat/tp
rsync --partial -z -e 'ssh -v -i id_rsa -oProxyCommand="ssh -i id_rsa yh@35.75.184.13 -p 10022 -N -W %h:%p"' mCtrl.tar.xz yh@10.64.4.45:~
测试udp连通性:端口占用-存在即使成功也不起作用的情况
nc -vuz 172.18.0.12 36802
测试udp连通性:端口占用
server:nc -lu 36802
client:nc -u 127.0.0.1 36802
查看程序占用的ip和端口号
netstat -[a|4]pn
tcpdump:抓取100源地址和36802的目的端口,tcp/udp用来修饰端口的
tcpdump -i ens5 -An src host 10.64.2.100 and udp dst port 36802
curl
# 模拟HTTP请求
curl 127.0.0.1:9909
# 下载文件类似wget,加k不进行ssl校验
curl -LOk https://ziglang.org/download/0.11.0/zig-0.11.0.tar.xz
ps查看进程
ps -ef
# 查看某进程的线程
ps -T -p pid
top -H -p pid
kill
kill -9 pid
pkill -f marketCtrl
git
# name,email,then need id_rsa for clone in git@
git config --global -e
git config --global user.name "[name]"
git config --global user.email "[email address]"
git config --global core.editor vi
git config --global http.sslverify false
# 暂存与恢复
git stash
git stash pop
# 丢弃工作区的修改或删除,不含新增或未追踪
git checkout .
# 删除所有未追踪的文件或目录,保险起见先查即将删除项:git clean -nxdf
git clean -df
git clean -xdf
# 加入暂存(当前目录不含.xx|当前目录|版本库所有目录)
git add [*|.|-A]
# 查看pull/push所用协议,更改使ssh密钥起作用
git remote -v
git config remote.origin.url git@gitlab.com:lets2rs/helix.git
查看log文件
tail -f x.log #退出ctrl+c
less +F x.log #退出ctrl+c;q