GNU/Linux话题

之初

不用我说,用过的都知道,帅呆了。一个程序只干一件事的哲学,串联起来征服了数字世界。在此记录GNU/Linux使用痕迹,又是一个身材匀称的胖子。

一些基础命令

hwclock

硬件时间设置就靠他。例如你可以把系统时间同步到硬件时间时间,也可以反向操作。下面的命令就是系统->硬件的同步过程。

date -s 07/20/2021
date -s 09:34:30
hwclock --systohc

xz

  1. 下面的命令可以可靠的解出xz格式的压缩文件,不要指望tar -xzvf 能帮咱们解开这样的文件。
xz -d you_file.tar.xz
  1. 压制一个xz格式的文件。
xz -z you_file_or_dir

sed

命令行下的三大神器之一,行编辑命令。看看下面的命令在干什么坏事。

例子1:删空行

#我删删删
sed -i "/^[ ]*$/d" target_text_file   

例子2:删除换行符

windows文本与linux文本的纠结,在这里终结吧。你知道吗?\r的十六进制表示是0x0d,同样的情况,\n的十六进制表示是0x0a。

sed -i 's/\r$//' target_file

grep

干净漂亮

ps -ef |grep process_name |grep -v "grep"

xargs

牛哄哄的工具,有时候需要参数自动化处理,xargs是必备。

awk

神器之一:awk
基本格式:awk ‘{BEGIN some code} {some code} {END some code}’ 关注-F 选项。awk自秀一下吧。

统计代码行数

虽然wc -l ./*.cpp已能料理好这个事情,一切为了效果。

wc -l ./your_code_dir/*.cpp |awk '{BEGIN sum=0} {sum +=$1} {print sum}'

wc

wc -l target_text_file

tar

find

find /usr/bin -name "ls*"

git

git起步走

概念要明确。比如:commit id就很重要,后悔药都靠它了。HEAD,HEAD^和HEAD~100的区别要明白,它们都和回退相关。超长的版本号(commit id) 269ce5f6acae225…不要晕,时常只用前4,5个就可以匹配了。
看看下面常用的命令。

  1. git clone your_remote_repo.
  2. git log.
  3. git log --pretty=one
  4. git reset --hard HEAD^ 或者 git reset --hard commit_id
  5. git reflog 后滚后再前滚时,它是解药,可以帮助找到commit id.
  6. git init --bare your_repo_name 记得修改拥有者为git,chown -R git:git your_repo_name.
  7. git remote -v 在仓库中查看远程库地址。记得是在迁出代码的本地仓库中执行它。

在ubuntu12上安装git

1.在/etc/apt/sources.list中放置好的,快的源服务器,关键字:apt sources.list。
2.apt update 或者 apt-get update。
3.apt/-get install git。好了,基本可以干好了。

下面是添加源服务器的另一个办法。
在ubuntu下添加源后,在线安装apt install git .
添加源的命令如下:

add-apt-repository ppa:git-core/ppa
apt update
apt install git

gdb

gdb依然是类unix平台下调试程序的NB工具。目前我在嵌入式下用它调试代码。
1.关于gdb的自动测试.
一段简单的gdb调试脚本,gdb专用。

#debug_your_code.gdb
break your_code_file_name.c:line
	commands 1
	p your_code_var
	continue
end
run

加载debug_your_code.gdb有两种方法:

  1. 交互模式下:进入gdb交互界面,file your_program, source debug_your_code.gdb
  2. 参数方式:gdb --batch --command=debug_your_code.gdb --args your_program
    我更喜欢第2种方法。
    需要注意的内容:编译时添加 -g编译选项。例如:在Qt环境下,在pro文件中添加:CONFIG += -g。

测试覆盖率工具

如果你的项目中测试覆盖率达到100%,那么恭喜你,不用接客户电话了。来点冰凉的水,清醒一下,100%那是什么存在?他只是个传说,努力的,绞尽脑汁的接近她,拥有她,你就成了。

gcov

GNU free的覆盖率检查工具。
编译选项中增加:-ftest-coverage -fprofile-arcs。编译后生成your_app_name.gcno。运行后生成your_app_name.gcda。就这么简单。接下来看下一条命令:lcov。

lcov

让你的gcda 可视化。做一下动作:

  1. lcov -c -d ./ -o your_app_name.info 该命令生成info文件,供第二条试用;
  2. genhtml -t “your_app_name” -s --legend -o html your_app_name.info 该命令生成html可视化文件,一目了然。
    一个简单的覆盖率例子
    这里有进一步资料,凑合着看。遇见更好的内容,我会尽快追加。

modinfo

驱动的面纱,我用modinfo揭。

modinfo you_driver
insmod your_driver param_name_1=value1 param_name_2=value2

nm

目标二进制文件中,函数的名称是什么?nm带你一睹芳容。

nm -s your_binary_file

一些内存命令

pmap

通过进程ID查看进程的内存占用和分布情况。

pmap 1249 -x   #这是我的实验进程

top

假设你想看进程的内存占用。粗略的显示。

top -p 1249 
cat /proc/1249/status  #可以更多内容

bash

它是GNU/Linux下流行的脚本解释器,网上的资料较多。这里记录特别的内容。
特点:对空格敏感,例如赋值号前后不能有空格,否则就头疼把,知道就好。

基础

逻辑比较操作

用于数值比较,测试语法:[ ],注意[]中需要填充空格

  1. -gt 大于 >
  2. -ge 大于等于 >=
  3. -lt 小于 <
  4. -lt 小于等于 <=
  5. -eq 等于 ==
if [ a -gt b ]; then
	command
fi

循环控制

for , while,until.看一下例子,了解基础框架。

for item in list; do
	command
done
for (( i=0; i<10; ++i ); do
	command
done
while [ 1 ]; do
	if [ -f file ]; then
		break
	fi
	commmand
done
until [ -f quit ]; do
	command
done

控制语句

if, select, case,看名知意思

if [ ! -f file ]; then
	command
el[se/if]
	command
fi
select name in "tigger" "rabbit" "wolf"; do
	case ${name} in
		"rabbit"|"wolf") break;;
		"tigger") ;;
	esac
done

&

timer.sh &

这里的&,用于开启一个sub-shell,在后台运行。可以通过fg取回到当前shell中,通过jobs查看sub-shell的运行状态。
技能特点:

  1. 调用者立即返回,返回为0,不阻塞后面的命令;
  2. 调用者shell退出后,sub-shell不会受其影响;
  3. sub-shell的输出仍在shell中输出;

nohup

真正的把sub-shell独立处理出来。接上节,让timer.sh放飞自我,自由翱翔一会儿。

nohup timer.sh &

一些函数

statfs

获取硬盘信息。

access

调试手段

导出异常文件-core

开放限制

查看是否允许导出,ulimit -c返回0表示关闭。使用ulimit -c unlimited 开放限制。

ulimit -c
ulimit -c unlimited

定制core的名称

  1. 通过修改 /proc/sys/kernel/core_uses_pid 文件可以让生成 core 文件名是否自动加上 pid 号。
    例如 echo 1 > /proc/sys/kernel/core_uses_pid ,生成的 core 文件名将会变成 core.pid,其中 pid 表示该进程的 PID。
  2. 通过修改 /proc/sys/kernel/core_pattern 来控制生成 core 文件保存的位置以及文件名格式。
    例如可以用 echo “/tmp/core-%e-%p-%t” > /proc/sys/kernel/core_pattern 设置生成的 core 文件保存在 “/tmp/” 目录下,文件名格式为 “core-命令名-pid-时间戳”。格式控制看这里.
%p - insert pid into filename 添加 pid
%u - insert current uid into filename 添加当前 uid
%g - insert current gid into filename 添加当前 gid
%s - insert signal that caused the coredump into the filename 添加导致产生 core 的信号
%t - insert UNIX time that the coredump occurred into filename 添加 core 文件生成时的 unix 时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名

gdb

objdump

objdump -tT your/lib/path/libname   #查看动态或静态库中的函数名称

神奇的编辑器

vim

这是一个神奇的编辑器,不用鼠标,只用键盘就能超速搞定你那一亩三分地儿。主要是有意思。

快速查找其他引用位置

移动光标到待查找的单词,按下SHIFT+ *,让后敲n(find next one)。也许开启高亮更直观。进入命令模式,set hlsearch可以开启高亮,相反,set nohlsearch关闭之。

emacs

嵌入式

关于设备时间

  1. 查看/etc/profile文件内容, 并在文件尾部增加以下代码。简单粗暴有效。需要注意软件中通过系统函数获取的时间是否符合预期,是否需要减少或增加8小时。关联的命令hwclock。
TZ="UTC-08:00"
export TZ

Win10下的Linux

必须说

原因只有一个,习惯了GNU/Linux命令的好。在Win10上轻装上阵即可,其他不论。不谈虚拟机,不谈WSL,不谈cygwin,只讲git-bash。
应用两篇文章,咱们的win中linux足矣。
第一篇来这里.
第二篇在这里.
如果第二篇不能访问,看第一篇基本无恙。

网络通信

内部进程通信

网络资料

Unix domain socket,进程间内部通信,这篇文章写的简单明了。

制作Ubuntu的ISO

以下链接中描述的内容,我没有亲自实验。先搬移进来,备用。
关于制作ubuntu系统ISO的简要说明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值