linux基础知识-18

一、启动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干去,老陌负责轻闲,倒!!

原文地址:https://www.cnblogs.com/myccloves/p/9338033.html