Linux基础总结(⼀)--Linux常⽤系统变
量,alias,Source,Linuxp。。。
以前做嵌⼊式的时候⽤到过linux,不过⼤部分操作都在ubuntu的界⾯环境下完成,使⽤⼀些简单的命令来配置,编译linux内核,现在要在终端下⼯作,所以整理⼀些⾃⼰平时遇到的问题,有不对不⾜的地⽅还望⼤家指出。
⽬录:
1. Shll built-in 变量
2. linux alias详解
3. Source 命令详解
4. Linux ps1 ps2 ps3 ps4详解
5. linux id 命令详解
6. umask 详解
7. linux trap命令详解
8. Linux stty
(1)Shell built-in 变量
$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 $KK
K
,发现没有值,假如您⽤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 /f &&
lilo -v
⽂件建⽴好之后,以后每次编译核⼼,只需要在/usr/src/linux-2.4.20下输⼊
source make_command
就⾏了。这个⽂件也完全可以做成脚本,只需稍加改动即可。这⾥主要是让⼤家理解source的⽤法。如果你⽤的不是lilo来引导系统,可以把最后两句话去掉。配置你⾃⼰的引导程序来引导新内核。
shell编程中的命令有时和C语⾔是⼀样的。&&表⽰与,||表⽰或。把两个命令⽤&&联接起来,如
ubuntu使用入门教程make mrproper && make menuconfig
,表⽰要第⼀个命令执⾏成功才能执⾏第⼆个命令。对执⾏顺序有要求的命令能保证⼀旦有错误发⽣,下⾯的命令不会盲⽬地继续执⾏。
(4)Linux ps1 ps2 ps3 ps4详解
⽤户登录Linux系统的字符界⾯后,就会出现"#"或"$"等命令提⽰符,⽐如"[root@pxe root]# “、"[oracle@db1 ~]$”或是 “-bash-3.00#”等等。通过设置环境变量PS1、PS2、PS3以及PS4来⾃定义⽤户命令⾏的字符显⽰。如果要长期永久性修改提⽰符,可以将修改提⽰符的命令添加到$HOME/.profile或$HOME/.bash_profile⽂件中。
1. PS1
PS1是主提⽰符变量,也是默认提⽰符变量。默认值"/s-/v/$“,显⽰shell类型和版本。
基本上通过设置PS1来定义命令⾏提⽰字符即可,最常⽤的需求就是显⽰登录的⽤户名、主⽬录、主机名等等,举个例⼦如下:
显⽰⽤户名,主机名和动态显⽰当前⽬录
-bash-3.00# export PS1="[/u@/h /w]"
[root@MagicLinux ~]cd /etc
[root@MagicLinux /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
$
$ ll
$ drwxr-xr-x ... test/
$ -rw-r--r-- ...
所以我们可以通过修改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+2  37) SIGRTMIN+3  38) SIGRTMIN+4  39) SIGRTMIN+5
40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8  43) 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-8  57) SIGRTMAX-7  58) SIGRTMAX-6  59) SIGRTMAX-5
60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2  63) 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
[root@mail ~]# 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;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。