一、启动shell
在linux系统中,shell是最常使用的程序。当我们登录或打开终端,shell会自动启动。如果我们想要运行shell的另一个实例,可以执行bash启动新shell,这个shell是原shell的子shell。
#启用新shell
bash
#退出新shell
exit
~/.bashrc文件
shell启动时会在用户主目录里面查找一个名为 ".bashrc"的文件,用它来自定义shell的一些环境变量等。shell启动时会执行这个文件中的代码。
我们可以添加一些命令到这个文件中,启动时会自动运行。比如添加:cal命令到这个文件中,之后登录终端看看效果:
echo "cal " >> ~/.bashrc
观察得知打开终端后会自动运行cal这条命令。
二、命令历史
当我们从键盘输入命令并执行,这些命令都会保存在命令的历史记录中。
(一)查看命令历史:history
[linux@ccloves ~]$ history
990 head -n 5 /etc/samba/smb.conf
991 tail /etc/samba/smb.conf
992 cat /etc/passwd
993 cat /etc/group
可以用up,down光标键快速浏览命令历史中的命令,即:上一条,下一条浏览……
(二)运行命令历史中的命令
当用history查看命令后,会发现每条命令前面有编号,可以用 !+编号 的方式运行此条命令。
1987 history | more
1988 clear
我们发现:1988是clear命令,此时想要运行clear就可以输入:
!1988
对于一条很长很长的命令,这样的操作是很方便快捷的。
如果只想执行上一条命令,可以用光标键调出上一条命令,之后回车。或者输入:!! 就可以了。
我们也可以通过 !+命令关键字 的方式来快速执行命令。这种命令的规则是从下向上搜索关键字,首次匹配则执行(匹配就是查看命令字符串前某些字符和关键字是否相等)。比如:
2001 ls /etc/fstab -l
2002 clear
2003 history
当输入!ls的时候,先匹配2003行,不符合继续匹配2002行,不符合继续匹配2001行,匹配成功,则执行 ls /etc/fstab -l这条命令。
(三)保存命令历史
当退出shell时,这些命令历史记录(在内存中),会保存到~/.bash_history中。 当启动shell时又从该文件中读取内容初始化命令历史。
(四)命令历史记录环境变量
HISTFILE 此变量指定保存命令历史的文件。我们可以通过 echo $HISTFILE来查看这个变量的值,结果是:~/.bash_history
HISTFILESIZE 1000 此变量决定~/.bash_history最多存放多少条记录
(五)history命令技巧
1. esc+. 和 alt+.
这两个快捷键的功能一样,可以恢复上一条命令的最后一个标记。比如:
[linux@ccloves ~]$ ls /etc/samba
gdbcommands smb.conf tls
[linux@ccloves ~]$ cd
我想查看ls /etc/samba目录里有没有smb.conf,如果有就用cd命令进入。经过查看果然在里面,此时输入cd 再输入/etc/samba很麻烦,我们可以按alt+.自动输入/etc/samba,也就是恢复最后一个标记。
老陌测试发现按多次,则一直向上切换最后一个标记。牛大了!!
2. ctrl+R组合键:
对于这样一个场景,我们输入了一些命令:
528 mkfs.ext4 /dev/sdb2
529 clear
530 history
531 mkdir /mnt/linux
532 mount /dev/sdb2 /mnt/linux
533 ls
534 ls /mnt/linux
535 history
[root@localhost ~]#
想要再次执行532行可以用!532,但有时候我们并不想查看history,因为我知道这个命令的开头是mount,此时可以用 ctrl+R 键,进入搜索状态,输入mou,shell后面自动提示,当确认是此条命令按回车执行。
(reverse-i-search)`mou': mount /dev/sdb2 /mnt/linux
3. fc命令:
fc命令自动打开vi编辑器,之后可以编辑命令,当退出编辑器时立即执行。对于一条很长的命令,用fc调用编辑器修改起来很方便。 老陌测试可以输入多条命令,退出之后一起执行。
退出时可以在命令模式下按ZZ
补充一点:我今天重装操作系统fc命令自动调用nano编辑器了,而不是vi。解决的方法是
fc -e vi
这样调用vi编辑器。 比如: fc -e gedit调用gedit编辑器了,当然这只是测试,为了修改默认调用的编辑器我们设置一个环境变量 :FCEDIT
echo "FCEDIT=vi" >> ~/.bashrc
这样就可以了。
(六)禁用历史命令
如果不想让shell命令保存到.bash_history中,怎么办?老陌认为你可能做坏事了,嘿嘿!
在linux中有一个设备节点文件/dev/null,这是一个黑洞,能收万物!我们创建它的软链接为.bash_history就可以了。
[root@localhost ~]# rm .bash_history
[root@localhost ~]# ln -s /dev/null .bash_history
之后体验一下吧。
三、运行多个命令
在一行输入多个命令,之间用分号隔开,这样就相当于一次执行多条命令。但有个缺点,没有机会检查第一个命令的效果。
linux@myccloves:~/exercises$ ls /etc/ ; clear
先执行ls /etc,执行完成之后执行clear。不过辛辛苦苦打印出来的文件列表,直接被清空了,白玩了……
这个分号让我们想起find命令的动作部分要以分号结尾,但我们输入分号时,shell认为这是一个命令分隔符,不是find命令的一部分,所以必须写成;转义,现在明白了。
四、在子shell中运行命令
通过前面知道运行一下bash得到了shell的另一个实例,称为子shell。只要将命令放到()里,就相当于在子shell中运行。
linux@myccloves:~/exercises$ pwd
/home/linux/exercises
linux@myccloves:~/exercises$ (cd /etc/samba; ls)
gdbcommands smb.conf tls
linux@myccloves:~/exercises$
我们发现当前工作目录是: /home/linux/exercises ,当我们执行 cd /etc/samba,并打印输出后,当前工作目录还是 /home/linux/exercises。这就说明子shell和当前shell环境是两个实例,之间没有影响。
老陌可以这样理解:
bash
cd /etc/samba
ls
exit
先开启子shell,执行命令,之后退出。
从此之后老陌牛了,有啥事让子shell干去,老陌负责轻闲,倒!!