BASH 中的空格

对于大部分 BASH 初学者而言,在动手写脚本时,遇到最频繁的错误,我想,大概就是这样:

1
2
3
4
5
#!/bin/bash

msg = "hello world" # msg: command not found

echo "My message: $msg"

在刚接触 BASH 时,我也在这个地方纠结了很久,为什么 = 前后不能有空格?但 google 了半天,几乎所有的人都只是说,这种写法是 BASH 固有的语法,而没有更深一层去追究这个问题。这里,这篇文章尝试从 BASH 的词法设计上去追寻这个问题的本质。

阅读全文

终端中的动画

在印象中,好像终端就是黑白界面,加扁平输出。是不是很乏味?其实现在 Linux/Unix 系统中带的终端模拟器是支持动画和彩色输出的。下面,一起来看看字符界面下的动画魅力!

定点输出

回车符(carriage return)

在这之前,我一直下意识的以为回车符和换行符是一个意思,相信有很多人也有这种错误的理解。其实不然,回车符(\r)是把光标返回到行首,而换行符(\n)才是把光标移到下一行。尽管在 Linux 中,是采用换行符作为新行的标识,但终端模拟器中还是会响应回车符 [1]。

OK,在理解了回车符和换行符的区别后,我们考虑一种情况:当在一行结束的时候,只输出回车符,而没有换行符,会发生什么?由于没有换行,只回到了行首,所以新打印的内容会把当前行覆盖。而我们可以基于这个特性,在脚本中做一些很有意思的动画。这里我写了一个例子,可以尝试一下:

阅读全文

BASH 的目录切换

在 BASH 中你用的最多的命令是什么?这绝对非 cd 莫属(ls 也是个潜力股,暂时做老二吧)。所以在这篇文章中,我们聊聊如何高效的在 BASH 中切换目录。

往后切换目录

回退目录,正规的做法是 cd ..。但网上的小伙伴很有才,发明了更简洁实用的命令。这里把它搬过来,其实我自己也一直这么用的:

1
2
3
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'

甚至可以定义5点的别名,但感觉用到的几率不大。有了这些别名,就可以愉快的用 N 个点来回退 N 级目录。

其实在进行目录切换时,BASH 默认会把上一个目录记录在 OLDPWD。可以用 cd -,或者 cd $OLDPWD 来在两个目录之间来回切换。这在两个不同的目录树下,很有作用。

阅读全文

BASH 的调试手段

平时在写 BASH 脚本时,总是会碰到让人抓狂的 BUG。和 C/C++ 这么丰富的调试工具相比,BASH 又有什么调试手段呢?

echo/print (普通技)

打印一些变量,或者提示信息。这应该是一个通用的方法了。在 BASH 里,我们可以简单的用 echo,或者 print 来输出一些 log,或者加一些 loglevel 来过滤一些 log。这里贴一下我平常用的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
_loglevel=2

DIE() {
echo "Critical: $1" >&2
exit 1
}

INFO() {
[ $_loglevel -ge 2 ] && echo "INFO: $1" >&2
}

ERROR() {
[ $_loglevel -ge 1 ] && echo "ERROR: $1" >&2
}

阅读全文

Linux Kernel 中的 Regmap

简介

Regmap 机制是在 Linux 3.1 加入进来的特性。主要目的是减少慢速 I/O 驱动上的重复逻辑,提供一种通用的接口来操作底层硬件上的寄存器。其实这就是内核做的一次重构。Regmap 除了能做到统一的 I/O 接口,还可以在驱动和硬件 IC 之间做一层缓存,从而能减少底层 I/O 的操作次数。

使用对比

在了解 Regmap 的实现细节前,我们先来对比一下,传统操作寄存器的方式,与 Regmap 之间的差异。

阅读全文