linux基础知识-21

Posted 老陌的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux基础知识-21相关的知识,希望对你有一定的参考价值。

一、shell的内置命令

shell自身提供了一些命令,称为内置命令,我们已经接触过一些shell的内置命令。

比如:

linux@myccloves:~$ which ls
/bin/ls
linux@myccloves:~$ which history cd fc jobs set
linux@myccloves:~$ 

我们用which查看ls,发现它在/bin/目录里。但查看history, cd, fc, jobs, set等命令,没有查到这些命令所在的位置,因为这些命令在shell程序内部,称为内置命令。

可以用help查看所有的内置命令

linux@myccloves:~$ help
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
......

job_spec [&]                                history [-c] [-d offset] [n] or history >
(( expression ))                            if COMMANDS; then COMMANDS; [ elif COMMA>
......

二、别名

别名允许用户自定义命令名,允许用户把命令和常用的参数或选项组合在一起。

(一)定义别名:

alias 别名=值

比如经常查看进程,运行: ps aux,但总输入aux太麻烦,能不能只用ps就相当于ps aux的效果? 当然可以:

linux@myccloves:~$ alias ps=\'ps aux\'
linux@myccloves:~$ ps
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 225292  9124 ?        Ss   09:01   0:02 /sbin/init splash
root         2  0.0  0.0      0     0 ?        S    09:01   0:00 [kthreadd]
......

再比如:能不能用另外一个名字替代一个命令的名字,当然可以:

linux@myccloves:~$ alias h=head
linux@myccloves:~$ h -2 /etc/os-release 
PRETTY_NAME="Deepin 15"
NAME="Deepin"

既然这样,老陌有很多歌曲放在了一个很遥远的地方,由于deepin音乐播放器总自动停止,所以老陌经常用mplayer在终端播放音乐。但问题是每次进入这个遥远的地方太麻烦了……

linux@myccloves:~$ cd  /media/linux/database/me/music 
linux@myccloves:/media/linux/database/me/music$ mplayer dj-1.mp3 

现在有了alias应该可以牛逼一把了吧。

linux@myccloves:~$ alias music=\'cd /media/linux/database/me/music\'
linux@myccloves:~$ music
linux@myccloves:/media/linux/database/me/music$ mplayer dj-1.mp3 

现在老陌想听歌,只要输入music,马上传送到音乐仓库了。 哇哈哈!!

(二)查看定义了哪些别名

直接输入alias就可以了。如:

linux@myccloves:/etc$ alias
alias ll=\'ls -l\'
alias ls=\'ls --color=auto\'
alias music=\'cd /media/linux/database/me/music\'

(三)删除别名

删除别名用 unalias 命令:

linux@myccloves:~$ unalias music
linux@myccloves:~$ alias
alias ll=\'ls -l\'
alias ls=\'ls --color=auto\'
linux@myccloves:~$ 

观察,music别名被删除了。 一个小问题,如果别名和命令名冲突了,先执行谁?

linux@myccloves:~$ alias ls=\'cd /etc/samba/\'
linux@myccloves:~$ ls
linux@myccloves:/etc/samba$ 

看到了吧,以事实说话,执行ls,得到的结果是进入了/etc/samba目录。如果ls 定义删除文件呢?死都不知道怎么死的...

三、自定义提示符

提示符就是等待用户输入命令部分。如:

linux@myccloves:~$ 

常见的提示符有两种:

  • 基本提示符
  • 第二提示符

我们发现,当输入没有完成时,按下回车之后shell继续等待用户输入,这时给出的提示符 > 就是第二提示符。

(一) 用PS1和PS2自定义提示符

这两个环境变量用于定义提示符。PS1对应基本提示符,PS2对应第二提示符。既然提示符是提示输入命令的作用,我们就改一下:

linux@myccloves:~$ PS1=\'请输入命令: \'
请输入命令: PS2=\'继续输入: \'
请输入命令: echo "hello
继续输入: world
继续输入: !
继续输入: 

当我们用 PS1=\'请输入命令: \' 定义了提示符后,马上提示符就变成了”请输入命令: “。 之后设置第二提示符为:PS2=\'继续输入: \',我们再次尝试echo "hello输入练习,发现第二提示符也变了。

好吧,再让我们玩一次:

linux@myccloves:~$ PS1=\'love deepin: \'
love deepin: ls /
bin   etc         initrd.img.old  lib64       mnt   recovery  sbin  tmp  vmlinuz
boot  home        lastore         lost+found  opt   root      srv   usr  vmlinuz.old
dev   initrd.img  lib             media       proc  run       sys   var
love deepin: 

我们可以用一些转义序列定义提示符,下面列出了常用的转义序列:

序列 说明
\\d 显示日期
\\T 显示时间
\\h 显示主机名
\\u 显示用户名
\\w 显示路径
\\W 显示路径的最后一个目录名
! 显示历史记录号
$ 如果是超级用户显示#, 如果是普通用户显示$

现在老陌定制一个和centos一样的提示符,因为老陌喜欢他的路径风格,不管路径多长,始终显示最后一个单词。提示符格式如下: [root@localhost ~]#

PS1=\'[\\u@\\h \\W]\\$ \'

注意:提示符中有一个字符有着通用的规则:# 表示超级用户,$ 表示普通用户,我们应该记住它。

四、配置文件立刻生效

我们经常修改~/.bashrc文件,这个文件在用户登录时会自动调用,但我们修改完不想退出系统再重新登录,此时可以source一下,相当于执行一次,重新配置环境变量。

[linux@myccloves test]$ echo "alias ld=\'ls -ld\'" >> ~/.bashrc
[linux@myccloves test]$ source ~/.bashrc
[linux@myccloves test]$ ld
drwxr-xr-x 2 linux linux 4096 Jul 21 07:50 .

我们修改了~/.bashrc文件,之后source一下,发现ld命令可以执行了。 与source功能一样的命令,就是在脚本前输入一个点,这个点相当于source。

[linux@myccloves test]$ . ~/.bashrc

这个方法很好,不用重新登录。当我们重新修改配置文件,想要立刻生效一定不要忘记source。

五、bash初始化

bash shell一般分为四类:登录shell,非登录shell,交互式shell, 非交互式shell。
当登录一台linux,您会看到提示符,这就是就登录shell。如:登录到虚拟终端,远程登录到一台主机等。登录shell又是交互式shell。

为了区别我们列举一些事例:
从虚拟控制台登录的, 通过网络登录到远程主机,x初始化的shell,这些都是登录shell,是交互式shell。手动运行bash启动的shell,不是登录shell,但他是交互式shell,在命令替换中的子shell,被圆括号分组的命令使用的子shell,执行脚本时使用的子shell不是登录shell,也不是交互式shell。

(一)登录shell:

以redhat系统为例:
当我们登录系统时,登录shell首先获取文件/etc/profile,这个文件初始化一些全局环境变量,之后获取/etc/profile.d/*.sh相匹配的文件。之后shell会去用户主目录里获取~/.bash_profile配置文件,之后获取 ~/.bashrc配置文件,最后获取/etc/bashrc配置文件。

注意:/etc/bashrc里面的内容和/etc/profile中的内容很像,但/etc/bashrc中定义的大部分是非登录shell用的环境变量。

(二)非登录,交互式shell

启动这个shell会自动获取~/.bashrc, 之后获取文件/etc/bashrc。

(三)非登录非交互式shell

不获取任何配置文件。

注意:只有登录shell才可以获取/etc/profile,~/.bash_profile,而~/.bashrc和/etc/bashrc文件能被所有shell(登录和非登录)获取。一般前两个用于配置环境变量,因为它们只初始化一次,后两个用于自定义变量,如:别名等。

(四)启动配置文件的介绍

文件 shell类型 预期功能
/etc/profile 登录shell 通用的有效环境变量
/etc/profile.d/*.sh 登录shell 软件包特有的环境变量
~/.bash_profile 登录shell 用户特有的环境变量
~/.bashrc 所有交互式shell 用户特有的别名,shell功能和shell选项
/etc/bashrc 所有交互式shell 通用别名,shell功能和shell选项

(五)退出登录shell

~/.bash_logout 用户注销时调用,这个一般很少用。有人用它清理~/.bash_history文件,但这不是好习惯,因为命令历史可以查看用过的命令,提高工作效率。而且系统出现故障可以从命令历史中查看,执行了什么命令导致故障。

以上配置文件及初始化的步骤是针对redhat系列的linux。对于deepin系统没有/etc/bashrc,与之对应的是/ect/bash.bashrc。而且我还发现deepin中没有~/.bash\\profile这个文件,有的是~/.profile 文件,网上查得:若bash是以login方式执行时,读取/.bash_profile,若它不存在,则读取/.bash_login,若前两者不存在,读取~/.profile。

老陌想为什么不统一一下呢,把老陌都搞晕了\\~\\~

以上是关于linux基础知识-21的主要内容,如果未能解决你的问题,请参考以下文章

逆向及Bof基础实践

[linux][c/c++]代码片段01

20155307刘浩《网络对抗》逆向及Bof基础

[linux][c/c++]代码片段02

20155311高梓云《网络对抗》逆向及Bof基础

20145301赵嘉鑫《网络对抗》逆向及Bof基础