《Unix & Linux 大学教程》 - 第七、八章 学习笔记
学习笔记,内容基础,适合初学者。
阅读之前,请务必花30秒查看前言说明(在第一、二章前面部分)
《Unix & Linux 大学教程》 - 第一、二章 学习笔记 Unix简介 & 什么是Linux?什么是Unix
《Unix & Linux 大学教程》 - 第三、四章 学习笔记 Unix连接 & 开始使用Unix
《Unix & Linux 大学教程》 - 第五、六章 学习笔记 GUI:图形用户界面 & Unix工作环境
《Unix & Linux 大学教程》 - 第七、八章 学习笔记 Unix键盘使用 & 能够立即使用的程序
《Unix & Linux 大学教程》 - 第九、十章 学习笔记 文档资料:Unix手册与Info & 命令语法
《Unix & Linux 大学教程》 - 第十一、十二章 学习笔记 shell & 使用shell:变量和选项
《Unix & Linux 大学教程》 - 第十三章 学习笔记 使用shell:命令和定制
《Unix & Linux 大学教程》 - 第十四、十五章 学习笔记 使用shell:初始化文件
《Unix & Linux 大学教程》 - 第二十一章 学习笔记 显示文件
《Unix & Linux 大学教程》 - 第二十二章(一) 学习笔记 vi文本编辑器(一)
《Unix & Linux 大学教程》 - 第二十二章(二) 学习笔记 vi文本编辑器 (二)
《Unix & Linux 大学教程》 - 第二十二章(三) 学习笔记 vi文本编辑器 (三)
《Unix & Linux 大学教程》 - 第二十四章 学习笔记 目录操作
《Unix & Linux 大学教程》 - 第二十五章 学习笔记 文件操作
《Unix & Linux 大学教程》 - 第二十六章(一) 学习笔记 进程和作业控制
《Unix & Linux 大学教程》 - 第二十六章(二) 学习笔记 进程和作业控制
《Unix & Linux 大学教程》 - 附录F 时区与24小时制时间
第七章:Unix 键盘使用
基础知识
信号:
intr(interrupt):ctrl+c,用来终止程序,少数终端将delete映射到intr上。此映射可修改。
可以停止一个僵死的程序,一些程序封闭了intr信号,防止不小心按下^C。
取消shell中输入并没有执行的命令
quit:^\,同intr,并生成一个磁心文件(core file),用于调试程序。如果没有调试过程序,但是一个名为core的文件出现在一个目录中,那么意味着运行的程序出现严重错误而终止(最常见的是段故障segmentation fault,当程序试图访问不是为该程序分配的内存时就会发生这种故障,例如:不正确的使用指针)。
(关于磁心文件的来历和使用在书中第128页。)
stop:^S,发送stop信号,Unix暂停屏幕显示。
start:^Q(qontinue即continue),发送start信号,重新启动屏幕显示。
eof(end of file):文件结束信号,^D。
封闭eof信号
Bash:设置环境变量IGNOREEOF,例如
$ IGNOREEOF=2 $ echo $IGNOREEOF 2 $ Use "exit" to leave the shell. $ Use "exit" to leave the shell.
按下^D后会显示Use "exit" to leave the shell.
Korn Shell:设置ignoreeof,命令、提示不同而已
C-Shell:设置ignoreeof,命令、提示不同而已
erase:删除最后一个键入的字符。backspace或delete,取决于键盘及其映射。
^H与^?
backspace与^H相同,用来发送BS码。delete与^?相同,用来发送DEL码,^?只是缩写,并不是真正的键组合。其意味着:whichever key on your keyboard that sends the code that used to be called DEL(您的键盘上某一个用来发送DEL码的键)。
后来Unix系统被配置成backspace等同于^?而不是^H。这种情况下,^?映射到erase而不是^H。
远程连接Unix主机时,按下backspace可能发生意想不到的情况。在自己机器上面可以删除最后的字符,可是远程机器上却没有,而是显示的^H。
这是因为本地机器将^H映射到了erase而远程机器将^?映射到了erase,可以通过修改映射来解决。
stty erase ^H
werase:删除最后一个键入的单词。通常是ctrl+w
kill:删除整行。ctrl+x或ctrl+u,取决键盘映射(我的ubuntu64bit10.10是ctrl+u)。
换行与返回
换行:^J,等同换行字符,新行字符;发送LF(linefeed,换行)码。
返回:^M,发送CR(carriage return,托架返回)码。
一般而言,每行文本必须以新行字符结束。
当按下return键时将发送一个返回字符,Unix自动将返回字符改变为新行字符。
在终端上显示数据时,每行必须以字符序列“返回+换行”结束。Unix自动将每行末尾的新行字符改变为返回字符+新行字符。
(windows使用^M^J标记每行结束,所以在Unix和Windows之间复制文件,必须进行转换,程序应该知道如何转换,如果不能自动改变,则需要工具完成)
程序/命令:
tty:显示自己终端的名称,我的结果:/dev/pts/0
stty(set tty):用来显示或改变终端设置,如果不加参数和选项,则只显示默认值已经改变的映射。stty -a:显示键映射,我机器部分结果为:
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O;
stty +信号名称 +对应键:修改键映射。如修改kill对应为^U,则需要按下脱字符(^)和一个U,而不是ctrl+u。
getty(get tty):用来打开一个终端的通信,并启动登录进程
pwd(print working ):显示工作目录
dmesg:显示系统启动过程中的全部消息。
cat:将数据连接起来,发送到默认输出(或标准输出)位置上。
less(+文件):分屏显示
向前移动一屏:space
向后移动一屏:b
退出:q
显示帮助:h
搜索:键入“/”即可,搜索字符为正则。
echo $变量名:显示变量值。
printenv:显示环境变量。
两个重要的打印命令:
lp(line printer,行打印机),lpr
环境变量:
TERM:设置为使用终端的类型。
IGNOREEOF:忽略eof信号,设置按下多少次^D后注销。
名次解释:
termcap:将所有不同类型的终端描述收集到一个数据库中,数据为纯文本,可以直接打开
curses:为使termcap使用简单而开发的程序界面。
terminfo:为了提高curses性能开发。terminfo将数据存储在一系列文件中,每种终端类型一个文件。这些文件组织到26个命名为a-z的目录中,都保存在terminfo目录下。数据编译过,无法直接打开,使用infocmp即可。
书中给了几个terminfo目录可能存在的位置,不过我在我机器上面都没找到什么有用的内容
/usr/share/terminfo/
/usr/lib/terminfo/
/user/share/lib/terminfo/
/usr/share/misc/terminfo/
破坏性退格:当光标向后移动时,光标经过的字符被删除,如按下backspace。
非破坏性退格:当光标向后移动时,没有内容被修改,例如按下left。
第八章:能够立即使用的程序
基础知识
程序/命令
which +程序名称:查看某个程序是否可用。
$which date less vi /bin/date /usr/bin/less /usr/bin/vi
type +程序名称:类似which,可能会比which显示更多信息,korn shell使用whence。
$ type date less date is /bin/date less is /usr/bin/less
android中执行上面两条命令
shell@android:/ # type whence whence is a shell builtin shell@android:/ # whence type 'whence -v'
另一台机器上面有which
root@android:/ # which type 1|root@android:/ # type which which is /sbin/which root@android:/ # type whence whence is a shell builtin root@android:/ # whence type 'whence -v'
date:显示时间和日期。date -u,查看UTC时间。
cal:显示日历。cal+4位年份,显示此年日历。-j可以显示出这是一年中的第几天。
比如现在是2012年8月,那么cal、cal 8 2012、cal 08 2012结果是一致的,下面是带有-j的结果。
一二三四五六日
214215216217218
219220221222223224225
226227228229230231232
233234235236237238239
240 241 242 243 244calendar:提醒服务,需要先建立一个名为calendar的文件,格式形为:June 21<Tab>内容。
系统有一些内置信息,感觉好像是“历史上的今天”应用一样。
8月06JonathanB.PostelisborninAltadena,California,1943
8月06AtomicbombdroppedonHiroshima,1945
8月06CaricominBarbados
8月06CyYoungpitchesfirstgame,1890
8月06BankHolidayinBritishColumbia,Fiji,Iceland,Ireland,Ontario
8月06EmancipationDayinBahamas
8月06IndependenceDayinBolivia
8月06*BankHoliday(ACT,NSW)
8月06*PicnicDay(NT)
8月06Soleilrougeenaoût,
C'estdelapluiepartout.
8月06ErsterAtombombenabwurfaufHiroshima,1945
8月06Berta,Bettina
8月07BattleofBoyacainColombia
8月07Aujourd'hui,c'estlaSt(e)Gaëtan.
8月07GründungderSozialdemokratischenArbeiterparteiinEisenach
unterderFührungvonAugustBebelundWilhelmLiebknecht,1869
8月 07 Ibolyauptime:显示系统运行了多长时间
$ uptime 14:48:23 up 5:16, 7 users, load average: 0.09, 0.04, 0.05
hostname:查看计算机名。
uname:显示操作系统名称(-a,显示全部信息)
root@android:/ # uname Linux
whoami:(之前提到过)显示当前用户标识,如果没有此命令,可以尝试who am i
$ who am i su1216 pts/4 2012-08-06 09:32 (:0.0) $ whoami su1216
quota:在共享系统上查看自己被允许使用多少磁盘空间(有的机器没有集成这个程序,我安装了之后,输入命令什么结果都没有输出)。
users:显示当前登录系统的所有用户标识
who:显示用户标识的登录时间,终端名称等。
who su1216 tty7 2012-07-13 15:26 (:0) su1216 pts/0 2012-07-26 09:59 (:0) su1216 pts/1 2012-08-06 14:59 (192.168.15.12)
一个ip为192.168.15.12的人正在使用su1216登录
w(who is doing what):可以查看更多信息
$ w 15:03:00 up 23 days, 23:49, 3 users, load average: 0.00, 0.01, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT su1216 tty7 :0 13Jul12 23days 49:25 0.19s gnome-session --session=ubuntu ……
第一行输出同uptime
下面8列信息分别为:
USER:当前登录系统的用户标识
TTY:各个用户标识使用的终端名称。
FROM:用户标识登录系统所使用的远程计算机名称。
LOGIN@:用户标识登录的时间。
IDLE:用户上一次按键后已经过去的时间。
JCPU:自登录后所有进程总共使用的处理器时间,J代表jobs。
PCPU:当前进程所使用的处理器时间,P代表process。
WHAT:当前正在运行的命令。
lock:终端临时上锁(我机器上没有这个程序。。)
leave:提醒何时离开。leave 1033,则10:33提醒,如果现在是下午八点,leave 855则意味着下午八点55提醒,而不是第二天上午。leave +15表示15分钟后提醒。系统注销时将废弃悬挂的leave命令。
内置计算器:bc
$ bc -l bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. 3+4;s(3.1415926);3^4;sqrt(16);ln(2.718) 7 .00000005358979323846 81 4.00000000000000000000 Runtime error (func=(main), adr=48): Function ln not defined. 3/4 .75000000000000000000 scale=2 3/4 .75 ^C (interrupt) use quit to exit.
-l选项可以使用内置数学库。
s表示sin,这里脱字符表示方幂,sqrt表示算数平方根,显然,当执行ln函数的时候失败了,系统没有提供这个函数。
然后计算3/4,发现居然保留了20位小数,通过设置scale改变精确度。
最后,当想使用ctrl+c结束程序的时候,系统提示需要使用quit命令来退出。
在bc也可以使用变量,如:
x=20 2*x 40
也可以改变进制,内容见bc帮助文档,或书中第160页。
名次解释:
儒略历(Julian calendar):儒略历是格里历的前身,由罗马共和国独裁官儒略·恺撒采纳埃及亚历山大的希腊数学家兼天文学家索西琴尼计算的历法,在公元前46年1月1日起执行,取代旧罗马历法的一种历法。一年设12个月,大小月交替,四年一闰,平年365日,闰年于二月底增加一闰日,年平均长度为365.25日。由于累积误差随着时间越来越大,1582年后被教皇格里高利十三世改善,变为格里历,即沿用至今的公历。
格里历(Gregorian calendar):儒略历1年平均长365.25日,比实际公转周期的365.2422日长11分14秒,即每400年约长3日。这样到公元16世纪时已经积累了有10天误差。可以明显感觉到两至两分提前了。在此情况下,教皇格里高里十三世于1582年宣布改历。先是一步到位把儒略历1582年10月4日的下一天定为格里历10月15日,中间跳过10天。同时修改了儒略历置闰法则。除了保留儒略历年数被4除尽的是闰年外。增加了被100除得尽而被400除不尽的则不是闰年的规定。这样的做法可在400年中减少3个闰年。在格里高里历历法里,400年中有97个闰年(每年366日)及303个平年(每年365日),所以每年平均长365.2425日,与公转周期的365.2422日十分接近。可基本保证到公元5000年前误差不超过1天。
代数式的表示:
例:34加上25的和再乘以15
中缀表示法:(34+25)*15
前缀表示法(波兰表示法,Polish notation):* + 34 25 15,将运算符放在操作数之前,使表达式更加紧凑。
后缀表示法(postfix notation)(逆波兰表示法RPN):34 25 + 15 *,将运算符放在操作数之后,适合自动计算。
dc:基于栈的计算器,dc的使用参见164页-166页。
栈:一种后进先出(last in first out,LIFO)的数据结构。
至此,160页已经过去了,终于感觉有点像unix教程了。历史内容似乎有所减少,作者依旧喜爱冷笑话和冷故事,汗阿!
从目录上看,大概从第十章开始才会出现大量技术内容,希望到时作者不要再讲历史了。估计他平时都是双份工资,一份是历史老师的工资。
转贴请保留以下链接
本人blog地址