linux基础知识-18
Tofloor
poster avatar
老陌
deepin
2018-07-20 04:02
Author
参见老陌博客:https://www.cnblogs.com/myccloves/p/9338033.html


一、启动shell
在linux系统中,shell是最常使用的程序。当我们登录或打开终端,shell会自动启动。如果我们想要运行shell的另一个实例,可以执行bash启动新shell,这个shell是原shell的子shell。

  1. #启用新shell
  2. bash

  3. #退出新shell
  4. exit
Copy the Code

~/.bashrc文件

shell启动时会在用户主目录里面查找一个名为 ".bashrc"的文件,用它来自定义shell的一些环境变量等。shell启动时会执行这个文件中的代码。

我们可以添加一些命令到这个文件中,启动时会自动运行。比如添加:cal命令到这个文件中,之后登录终端看看效果:
  1. echo "cal " >> ~/.bashrc
Copy the Code


观察得知打开终端后会自动运行cal这条命令。

二、命令历史
当我们从键盘输入命令并执行,这些命令都会保存在命令的历史记录中。

(一)查看命令历史:history

  1. [linux@ccloves ~]$ history
  2. 990  head -n 5 /etc/samba/smb.conf
  3. 991  tail /etc/samba/smb.conf
  4. 992  cat /etc/passwd
  5. 993  cat /etc/group
Copy the Code

可以用up,down光标键快速浏览命令历史中的命令,即:上一条,下一条浏览……

(二)运行命令历史中的命令

当用history查看命令后,会发现每条命令前面有编号,可以用 !+编号 的方式运行此条命令。

  1. 1987  history | more
  2. 1988  clear
Copy the Code

我们发现:1988是clear命令,此时想要运行clear就可以输入:

  1. !1988
Copy the Code

对于一条很长很长的命令,这样的操作是很方便快捷的。

如果只想执行上一条命令,可以用光标键调出上一条命令,之后回车。或者输入:!! 就可以了。

我们也可以通过 !+命令关键字 的方式来快速执行命令。这种命令的规则是从下向上搜索关键字,首次匹配则执行(匹配就是查看命令字符串前某些字符和关键字是否相等)。比如:

  1. 2001  ls /etc/fstab -l
  2. 2002  clear
  3. 2003  history
Copy the Code

当输入!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+.

这两个快捷键的功能一样,可以恢复上一条命令的最后一个标记。比如:

  1. [linux@ccloves ~]$ ls /etc/samba
  2. gdbcommands  smb.conf  tls
  3. [linux@ccloves ~]$ cd
Copy the Code

我想查看ls /etc/samba目录里有没有smb.conf,如果有就用cd命令进入。经过查看果然在里面,此时输入cd 再输入/etc/samba很麻烦,我们可以按alt+.自动输入/etc/samba,也就是恢复最后一个标记。
老陌测试发现按多次,则一直向上切换最后一个标记。牛大了!!

2. ctrl+R组合键:

对于这样一个场景,我们输入了一些命令:

  1. 528  mkfs.ext4 /dev/sdb2
  2. 529  clear
  3. 530  history
  4. 531  mkdir /mnt/linux
  5. 532  mount /dev/sdb2 /mnt/linux
  6. 533  ls
  7. 534  ls /mnt/linux
  8. 535  history
  9. [root[url=home.php?mod=space&uid=72751]@localhost[/url] ~]#
Copy the Code

想要再次执行532行可以用!532,但有时候我们并不想查看history,因为我知道这个命令的开头是mount,此时可以用 ctrl+R 键,进入搜索状态,输入mou,shell后面自动提示,当确认是此条命令按回车执行。

  1. (reverse-i-search)`mou': mount /dev/sdb2 /mnt/linux
Copy the Code

3. fc命令:
fc命令自动打开vi编辑器,之后可以编辑命令,当退出编辑器时立即执行。对于一条很长的命令,用fc调用编辑器修改起来很方便。 老陌测试可以输入多条命令,退出之后一起执行。



退出时可以在命令模式下按ZZ

补充一点:我今天重装操作系统fc命令自动调用nano编辑器了,而不是vi。解决的方法是
  1. fc -e vi
Copy the Code

这样调用vi编辑器。 比如: fc -e gedit调用gedit编辑器了,当然这只是测试,为了修改默认调用的编辑器我们设置一个环境变量 :FCEDIT
  1. echo "FCEDIT=vi" >> ~/.bashrc
Copy the Code

这样就可以了。

(六)禁用历史命令

如果不想让shell命令保存到.bash_history中,怎么办?老陌认为你可能做坏事了,嘿嘿!
在linux中有一个设备节点文件/dev/null,这是一个黑洞,能收万物!我们创建它的软链接为.bash_history就可以了。
  1. [root@localhost ~]# rm .bash_history
  2. [root@localhost ~]# ln -s /dev/null  .bash_history
Copy the Code

之后体验一下吧。


三、运行多个命令
在一行输入多个命令,之间用分号隔开,这样就相当于一次执行多条命令。但有个缺点,没有机会检查第一个命令的效果。

  1. linux@myccloves:~/exercises$ ls /etc/ ; clear
Copy the Code

先执行ls /etc,执行完成之后执行clear。不过辛辛苦苦打印出来的文件列表,直接被清空了,白玩了……

这个分号让我们想起find命令的动作部分要以分号结尾,但我们输入分号时,shell认为这是一个命令分隔符,不是find命令的一部分,所以必须写成;转义,现在明白了。

四、在子shell中运行命令
通过前面知道运行一下bash得到了shell的另一个实例,称为子shell。只要将命令放到()里,就相当于在子shell中运行。
  1. linux@myccloves:~/exercises$ pwd
  2. /home/linux/exercises
  3. linux@myccloves:~/exercises$ (cd /etc/samba; ls)
  4. gdbcommands  smb.conf  tls
  5. linux@myccloves:~/exercises$
Copy the Code

我们发现当前工作目录是: /home/linux/exercises ,当我们执行 cd /etc/samba,并打印输出后,当前工作目录还是 /home/linux/exercises。这就说明子shell和当前shell环境是两个实例,之间没有影响。
老陌可以这样理解:

  1. bash
  2. cd /etc/samba
  3. ls
  4. exit
Copy the Code

先开启子shell,执行命令,之后退出。

从此之后老陌牛了,有啥事让子shell干去,老陌负责轻闲,倒!!

Reply Favorite View the author
All Replies
avatar
baikal
deepin
2018-07-20 19:40
#1
老陌厉害
Reply View the author
avatar
baikal
deepin
2018-07-20 19:41
#2
天天都是满满的学习动力!
Reply View the author
avatar
135******62
deepin
2018-07-20 20:30
#3
老陌什么时候出个 Emacs使用教程 一直想学
Reply View the author