Linux 基础总结(一)
Linux 基础总结(一)
以前做嵌入式的时候用到过linux,不过大部分操作都在ubuntu的界面环境下完成,使用一些简单的命令来配置,编译linux内核,现在要在终端下工作,所以整理一些自己平时遇到的问题,有不对不足的地方还望大家指出。
目录:
1. Linux常用系统变量
2. linux alias详解
3. Source 命令详解
4. Linux ps1 ps2 ps3 ps4详解
5. linux id 命令详解
6. umask 详解
7. linux trap命令 详解
8. Linux stty
(1)Linux 常用系统变量
$0 当前shell程序的名字
$1 ~ $9 命令行上的第一到第九个参数
$# 命令行上的参数个数
$* 命令行上的所有参数
$@ 分别用双引号引用命令行上的所有参数
$$ 当前进程的进程标识号(PID)
$? 上一条命令的退出状态
$! 最后一个后台进程的进程标识号
系统变量只能引用不能修改!
(2)linux alias详解
一、简介
linux alias是命令的一种别称,输入
alias
可以看到像下面这样的结果:
alias vi="vim"
也即,输入vi后,被自动定向到vim这个命令了。alias的作用就是,可以简写命令。
二、修改alias
若要添加自己的alias,格式如下
alias la="ls -al --color=auto"
三、修改配置文件
上述命令,在用户登出后就无效了,可以用修改配置文件的办法,使每次都能够自动生效。
若要修改用户(而非全部用户)自己的alias,可以修改~/.bashrc文件
vii ~/.bashrc
再最后面加上你自己定义的alias,如
alias la="ls -al --color=auto"
这个修改,要下次登录的时候才能生效。想要即刻生效,可以输入
source ~/.bashrc
四、常用的alias
这个根据个人爱好了,可以google之~找到你自己喜欢的alias
五、修改全局的alias可以修改系统配置文件,我这里就不说了。
还有其他的方面知识,如交互式、非交互式登录的配置文件,这个也不多说了。
(3)source命令详解
source FileName
作用:在当前bash环境下读取并执行FileName中的命令。
注:该命令通常用命令“.”来替代。
如:source .bash_rc 与 . .bash_rc 是等效的。
source命令(从 C Shell 而来)是bash shell的内置命令。点命令,就是个点符号,(从Bourne
Shell而来)是source的另一名称。同样的,当前脚本中配置的变量也将作为脚本的环境,source(或点)命令通常用于重新执行刚修改的初始化
文档,如 .bash_profile 和 .profile 等等。例如,假如在登录后对 .bash_profile 中的 EDITER 和
TERM 变量做了修改,则能够用source命令重新执行 .bash_profile 中的命令而不用注销并重新登录。
比如您在一个脚本里export $KKK=111 ,假如您用./a.sh执行该脚本,执行完毕后,您运行 echo $KKK
,发现没有值,假如您用source来执行,然后再echo
,就会发现KKK=111。因为调用./a.sh来执行shell是在一个子shell里运行的,所以执行后,结构并没有反应到父shell里,但是
source不同他就是在本shell中执行的,所以能够看到结果
source命令的一个妙用
在编译核心时,常常要反复输入一长串命令,如
make mrproper
make menuconfig
make dep
make clean
make bzImage
.......
这些命令既长,又繁琐。而且有时候容易输错,浪费你的时间和精力。如果把这些命令做成一个文件,让它自动按顺序执行,对于需要多次反复编译核心的用
户来说,会很方便。用source命令可以办到这一点。它的作用就是把一个文件的内容当成是shell来执行。先在/usr/src/linux-
2.4.20目录下建立一个文件,取名为make_command:
在其中输入如下内容:
make mrproper &&
make menuconfig &&
make dep &&
make clean &&
make bzImage &&
make modules &&
make modules_install &&
cp arch/i386/boot/bzImge /boot/vmlinuz_new &&
cp System.map /boot &&
vi /etc/lilo.conf &&
lilo -v
文件建立好之后,以后每次编译核心,只需要在/usr/src/linux-2.4.20下输入
source make_command
就行了。这个文件也完全可以做成脚本,只需稍加改动即可。这里主要是让大家理解source的用法。如果你用的不是lilo来引导系统,可以把最后两句话去掉。配置你自己的引导程序来引导新内核。
shell编程中的命令有时和C语言是一样的。&&表示与,||表示或。把两个命令用&&联接起来,如
make mrproper && make menuconfig
,表示要第一个命令执行成功才能执行第二个命令。对执行顺序有要求的命令能保证一旦有错误发生,下面的命令不会盲目地继续执行。
(4)Linux ps1 ps2 ps3 ps4详解
用户登录Linux系统的字符界面后,就会出现"#"或"$"等命令提示符,比如"# “、"$”或是 “-bash-3.00#”等等。
通过设置环境变量PS1、PS2、PS3以及PS4来自定义用户命令行的字符显示。如果要长期永久性修改提示符,可以将修改提示符的命令添加到$HOME/.profile或$HOME/.bash_profile文件中。
1. PS1
PS1是主提示符变量,也是默认提示符变量。默认值"/s-/v/$“,显示shell类型和版本。
基本上通过设置PS1来定义命令行提示字符即可,最常用的需求就是显示登录的用户名、主目录、主机名等等,举个例子如下:
显示用户名,主机名和动态显示当前目录
-bash-3.00# export PS1=""
cd /etc
注意:如果当前目录是用户的HOME目录,则显示"~"
PS1变量可以使用的参数值有如下:
/d
代表日期,格式为weekday month date,例如:"Mon Aug 1"
/H
完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux
/h
仅取主机的第一个名字,如上例,则为fc4,.linux则被省略
/t
显示时间为24小时格式,如:HH:MM:SS
/T
显示时间为12小时格式
/A
显示时间为24小时格式:HH:MM
/u
当前用户的账号名称
/v
BASH的版本信息
/w
完整的工作目录名称。家目录会以 ~代替
/W
利用basename取得工作目录名称,所以只会列出最后一个目录
/#
下达的第几个命令
/$
提示字符,如果是root时,提示符为:# ,普通用户则为:$
/[
字符"["
/]
字符"]"
/!
命令行动态统计历史命令次数
2. PS2
PS2是副提示符变量,默认值是''> ''。
PS2一般使用于命令行里较长命令的换行提示信息,比如:
默认设置
-bash-3.00# rpm -q gcc make binutils openmotif setarch compat-db compat-gcc /
> compat-gcc-c++ compat-libstdc++ compat-libstdc++-devel
自定义设置
-bash-3.00# export PS2="PS2 => "
-bash-3.00# rpm -q gcc make binutils openmotif setarch compat-db compat-gcc /
PS2 => compat-gcc-c++ compat-libstdc++ compat-libstdc++-devel
3. PS3,PS4
这两个环境变量可能用得不多,不研究了。如果有兴趣,可以学习bash里面的简介。
(可以百度 linux超級技巧,第33章專門講述了ps3,ps4)
PS3 The value of this parameter is used as the prompt for the select command (see SHELL GRAMMAR above).
PS4 The value of this parameter is expanded as with PS1 and the value is printed before each command bash displays during an execution trace. The first character of PS4 is replicated multiple times, as neces-sary, to indicate multiple levels of indirection. The default is ''+ ''.
(5)linux id 命令详解
功能说明:显示用户的ID,以及所属群组的ID。
语 法:id [-gGnru][--help][--version][用户名称]
补充说明:id会显示用户以及所属群组的实际与有效ID。
若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户的ID。
参 数:
-g或--group 显示用户所属群组的ID。
-G或--groups 显示用户所属附加群组的ID。
-n或--name 显示用户,所属群组或附加群组的名称。
-r或--real 显示实际ID。
-u或--user 显示用户ID。
-help 显示帮助。
-version 显示版本信息。
(6)umask详解
umask=022中"022"是八进制的写法,如果换成二进制是000010010
在unix中文件权限是三类用户,三种权限。三类用户分别是文件所有者user(u),文件所有者所在主群组group(g)、其它用户others(o),三种权限分别是起读read(r)、写write(w)、执行execute(x)。
如果一个文件的权限如下:所有者有读写的权限,群组有读和执行权限、其它用户有读权限,可以写成:
rw-xr-r--
其中前三位指明了所有者的权限、中间三位指明了组权限、最后三位指明了其它用户的权限。我们用ls -l可以看到文件权限详情,列出来的是10位,最前一位如果是d表示是子目录。
事实上,新建文件夹或文件的权限是由所谓基本码减去称之为umask的屏蔽位得到的。
按照规定:文件夹的基本码是rwxrwxrwx(777),文件的基本码是rw-rw-rw-(666)
而屏蔽位则是在/etc/profile(所有人)或者~/.profile中设定的。如果上述文件中皆无设定则默认就是022
我们可以在shell下面输入umask命令查看/修改当前的系统屏蔽位。
$ umask 033
$ umask
$ 033
$ umask 022
因此新建文件夹是777-022=755(rwxr-xr-x),新建文件是666-022=644(rw-r--r--)。
$ mkdir test
$ touch test.txt
$ ll
$ drwxr-xr-x ... test/
$ -rw-r--r-- ... test.txt
所以我们可以通过修改umask来改变新建文件文、件夹的权限.
(7)linux trap命令 详解
trap命令用于指定在接收到信号后将要采取的动作。常见的用途是在脚本程序被中断时完成清理工作。不过,这次我遇到它,是因为客户有个需求:从终端访问服务器的用户,其登陆服务器后会自动运行某个命令,例如打开应用(命令写在.bashrc等文件中),最后退出,并断开连接;期间是不能允许其使用Ctrl+C等中断退出应用,而回到Shell环境,否则可能会带来安全问题。
当然,解决的方式有很多,如在应用中屏蔽中断信号、使用chroot方式访问等。但这些方法都有一些限制,如需要修改应用,让telnet等支持chroot方式(ssh可支持chroot)等。而使用trap也是一种比较好的解决方法。
一、关于信号
历史上,shell总是用数字来代表信号,而新的脚本程序应该使用信号的名字,它们保存在用#include命令包含进来的signal.h头文件中,在使用信号名时需要省略SIG前缀。
kill和trap等都可以看到信号编号及其关联的名称。“信号”是指那些被异步发送到一个程序的事件。默认情况下,它们通常会终止一个程序的运行。
引用
# trap -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1
36) SIGRTMIN+237) SIGRTMIN+338) SIGRTMIN+439) SIGRTMIN+5
40) SIGRTMIN+641) SIGRTMIN+742) SIGRTMIN+843) SIGRTMIN+9
44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-857) SIGRTMAX-758) SIGRTMAX-659) SIGRTMAX-5
60) SIGRTMAX-461) SIGRTMAX-362) SIGRTMAX-263) SIGRTMAX-1
64) SIGRTMAX
附录中有个说明文档。
二、trap的使用
1、运行格式
trap命令的参数分为两部分,前一部分是接收到指定信号时将要采取的行动,后一部分是要处理的信号名。
trap command signal
它有三种形式分别对应三种不同的信号回应方式。
第一种:
trap "commands" signal-list
当脚本收到signal-list清单内列出的信号时,trap命令执行双引号中的命令。
第二种:
trap signal-list
trap不指定任何命令,接受信号的默认操作,默认操作是结束进程的运行。
第三种:
trap " " signal-list
trap命令指定一个空命令串,允许忽视信号,我们用到的就是这一种。
※ 请记住,脚本程序通常是以从上到下的顺序解释执行的,所以必须在你想保护的那部分代码以前指定trap命令。
2、测试
按照用户的要求,我们需要屏蔽的是HUP INT QUIT TSTP几个信号。所以,可以运行:
# trap "" HUP INT QUIT TSTP
这个时候,可以试试打开一个持续的命令,然后中断其运行,例如:
# tail -f /var/log/messages
接着,试试用Ctrl+C或 Ctrl+\ 来中断试试,会程序是不会退出的。
3、恢复信号
如果想恢复的话,可以用Ctrl+Z把程序放到后台,然后运行:
# trap : HUP INT QUIT TSTP
然后,用ps -ef看看其PID号,bg 1让程序继续运行,最后用kill杀掉即可。
4、其他
您也可以试试运行:
# trap "echo 'Hello World' " HUP INT QUIT TSTP
这样,当您运行Ctrl+C等中断时,会自动运行echo命令,结果就是现实Hello World字符串:
引用
# tail -f /var/log/messages
May 18 16:57:54 192.168.228.153 dhcpd: DHCPREQUEST for 192.168.228.221 from 00:1d:72:92:d4:68 via eth0
May 18 16:57:54 192.168.228.153 dhcpd: DHCPACK on 192.168.228.221 to 00:1d:72:92:d4:68 via eth0
# Hello World
※ 注意,这方式并不能屏蔽中断,敲入Ctrl+C等信息后,仍以默认行为动作的,也就是退出程序,仅会再运行一个额外的命令而已。
三、附录
1、中断按键
不同的终端类型、Shell版本其中断的按键是不同的,甚至还可以自定义,这可通过stty命令查询:
引用
# stty -a
speed 38400 baud; rows 30; columns 111; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ; eol2 = ; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
^就是Ctrl的缩写。
2、信号详情
引用
名称 默认动作 说明
SIGHUP 终止进程 终端线路挂断
SIGINT 终止进程 中断进程
SIGQUIT建立CORE文件 终止进程,并且生成core文件
SIGILL 建立CORE文件 非法指令
SIGTRAP建立CORE文件 跟踪自陷
SIGBUS 建立CORE文件 总线错误
SIGSEGV建立CORE文件 段非法错误
SIGFPE 建立CORE文件 浮点异常
SIGIOT 建立CORE文件 执行I/O自陷
SIGKILL终止进程 杀死进程
SIGPIPE终止进程 向一个没有读进程的管道写数据
SIGALarm 终止进程 计时器到时
SIGTERM终止进程 软件终止信号
SIGSTOP停止进程 非终端来的停止信号
SIGTSTP停止进程 终端来的停止信号
SIGCONT忽略信号 继续执行一个停止的进程
SIGURG 忽略信号 I/O紧急信号
SIGIO 忽略信号 描述符上可以进行I/O
SIGCHLD忽略信号 当子进程停止或退出时通知父进程
SIGTTOU停止进程 后台进程写终端
SIGTTIN停止进程 后台进程读终端
SIGXGPU终止进程 CPU时限超时
SIGXFSZ终止进程 文件长度过长
SIGWINCH 忽略信号 窗口大小发生变化
SIGPROF终止进程 统计分布图用计时器到时
SIGUSR1终止进程 用户定义信号1
SIGUSR2终止进程 用户定义信号2
SIGVTALRM终止进程 虚拟计时器到时
谢谢分享
页:
[1]