网站首页 > 基础教程 正文
shell会根据提示执行程序。当你发出一个命令时,shell会搜索该程序,然后执行它。例如,当你输入命令ls时,shell会搜索名为ls的工具/程序,然后在shell中运行它。提供给实用程序的参数和选项会影响您得到的结果。shell也被称为CLI或命令行界面。
1: 修改默认shell
大多数现代发行版都预先安装了BASH(又是Bourne SHell),并将其配置为默认SHell。
chsh (changeshell)是Linux中负责修改shell的命令(实际上是可执行二进制文件,ELF)。
首先可以使用chsh -l命令检查机器上已经安装和配置了哪些shell,输出结果类似于下面这样:
[demouser@vbox ~]$ chsh -l
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/usr/bin/tmux
/bin/tmux
/usr/bin/zsh
/bin/zsh
在某些Linux发行版中(如:Ubuntu),chsh -l命令是无效的。在本例中,所有可用shell的列表也可以在 /etc/shells 文件中找到。你可以用 cat 命令显示文件内容:
demouser@demohosts:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/usr/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/usr/bin/dash
现在我们可以选择新的默认shell,例如sh,并使用chsh -s对其进行配置。
[demouser@vbox ~]$ chsh -s /usr/bin/zsh
Changing shell for demouser.
密码:
Shell changed.
现在剩下要做的就是执行一个 退出-重新登陆 的循环,然后就可以享受我们新的默认shell。
如果您希望为不同的用户更改默认shell,并且您在计算机上具有超级管理员或者 sudo 的权限,则可以像root用户一样使用 chsh 命令来完成此操作。假设我们想将 user_2 的默认 shell 更改为 zsh ,使用和之前我们用过的命名相同的命令,但在后面再追加一个用户名的参数,chsh -s /usr/bin/zsh user_2.
为了检查当前的默认 shell 是什么,我们可以查看$SHELL环境变量,它指向默认shell的路径,因此在我们的更改之后,我们期望得到类似的结果:
[demouser@vbox]~% echo $SHELL
/usr/bin/zsh
下面是chsh --help的输出结果,列出了chsh可用的选项和使用的格式:
[root@vbox demouser]# chsh --help
Usage:
chsh [options] [<username>]
Change your login shell.
Options:
-s, --shell <shell> specify login shell
-l, --list-shells print list of shells and exit
-h, --help display this help
-V, --version display version
2: 基础的Shell实用程序
自定义Shell提示符
默认的命令提示符可以更改,使其看起来不同和简短。如果当前目录太长,默认命令提示符会变得太大。在这些情况下,使用PS1很有用。简短而定制的命令漂亮而优雅。在下表中,PS1与一些参数一起使用,以显示不同形式的shell提示。默认的命令提示符看起来像这样:
user@host ~ $
在我的例子中,它看起来像这样:
demouser@vbox ~ $
它可以按照下表进行更改:
配置内容 | 示例和说明 |
PS1='\w #39; | ~ $ 目录名称作为Shell提示符,在本例中,~为用户的家目录。 |
PS1='\h $ ' | gotham $ 主机名作为Shell提示符 |
PS1='\u $ ' | bruce $ 用户名作为Shell提示符 |
PS1='\t $ ' | 22:37:31 $ 24小时格式时间作为Shell提示符 |
PS1='\@ $ ' | 10:37 PM 12小时格式时间作为Shell提示符 |
PS1='\! $ ' | 732 显示命令的历史编号作为Shell提示符 |
PS1='dude $ ' | dude $ 以你自己喜欢的字符串作为Shell提示符 |
一些基本的 shell 快捷键
快捷键 | 说明 |
Ctrl-k | 剪切 |
Ctrl-y | 粘贴 |
Ctrl-a | 将光标移动到行首 |
Ctrl-e | 将光标移动到行尾 |
Ctrl-d | 删除光标所在位置的字符 |
Ctrl-l | 清屏,清除掉当前屏幕上所有的内容,只留下光标所在的行为最上面的一行 |
Ctrl-u | 删除从提示符到光标所在位置之间的字符 |
Ctrl-_ | (要输入下划线,需要按Shift键,所以此处的快键键应该为 Ctrl - Shift - 减号 )撤销在命令行中输入的最后一个内容 |
Ctrl-c | 中断/停止 在前台运程的程序/进程 |
Ctrl-r | 反向历史搜索 |
重要的文件 ~/.bash_history和命令history
~/.bash_history: 存储shell上最近使用的500个命令/事件
history: 将显示命令历史
history | grep <key-word>: 将显示历史上所有具有关键字<关键字>的命令(在您记住过去使用的命令的部分内容时很有用)
3: 创建自己的命令别名
如果你厌倦了在bash中使用冗长的命令,你可以创建自己的命令别名。
最好的方法是在主文件夹中修改(如果不存在,则创建)一个名为.bash_aliases的文件。通用语法是:
alias command_alias='actual_command'
其中actual_command是您要重命名的命令,command_alias是您给它的新名称。
例如:
alias apt-install='sudo apt-get -y install'
将新的命令别名 apt-install 映射到实际的命令 sudo apt-get -y install。这意味着当你在终端中使用apt-install 时,bash 会将其解释为 sudo apt-get -y install。
4: 在系统中找到一个文件
Using bash you can easily locate a file with the locate command. For example say you are looking for the file mykey.pem:
使用 bash,您可以使用 locate 命令轻松定位文件。如果你是首次支持locate命令,可能会报错/var/lib/plocate/plocate.db: 没有那个文件或目录:
[demouser@vbox ~]$ locate sshd_config
/var/lib/plocate/plocate.db: 没有那个文件或目录
那你需要先执行updatedb:
[demouser@vbox ~]$ sudo updatedb
假设你要查找文件sshd_config:
[demouser@vbox ~]$ locate sshd_config
/etc/ssh/sshd_config
/etc/ssh/sshd_config.d
/usr/lib/systemd/sshd_config.d
/usr/lib/systemd/sshd_config.d/20-systemd-userdb.conf
/usr/share/man/man5/sshd_config.5.gz
上面的sshd_config这个文件名称有点长,如果你正在寻找这个文件,但是只记得它是一个 ssh 开头又好像有config 部分。中间是什么确忘了,此时可以使用管道将 locate 命令和 grep 命令结合起来,如下所示:
[demouser@vbox ~]$ locate ssh |grep config
/etc/crypto-policies/back-ends/libssh.config
/etc/crypto-policies/back-ends/openssh.config
/etc/crypto-policies/back-ends/opensshserver.config
/etc/libssh/libssh_client.config
/etc/libssh/libssh_server.config
/etc/ssh/ssh_config
/etc/ssh/ssh_config.d
/etc/ssh/sshd_config
/etc/ssh/sshd_config.d
/etc/ssh/ssh_config.d/20-systemd-ssh-proxy.conf
/etc/ssh/ssh_config.d/30-libvirt-ssh-proxy.conf
/etc/ssh/ssh_config.d/50-redhat.conf
/etc/sysconfig/sshd
/usr/lib/systemd/ssh_config.d
/usr/lib/systemd/sshd_config.d
/usr/lib/systemd/ssh_config.d/20-systemd-ssh-proxy.conf
/usr/lib/systemd/sshd_config.d/20-systemd-userdb.conf
/usr/share/crypto-policies/back-ends/DEFAULT/libssh.config
/usr/share/crypto-policies/back-ends/DEFAULT/openssh.config
/usr/share/crypto-policies/back-ends/DEFAULT/opensshserver.config
/usr/share/crypto-policies/back-ends/FIPS/libssh.config
/usr/share/crypto-policies/back-ends/FIPS/openssh.config
/usr/share/crypto-policies/back-ends/FIPS/opensshserver.config
/usr/share/crypto-policies/back-ends/FUTURE/libssh.config
/usr/share/crypto-policies/back-ends/FUTURE/openssh.config
/usr/share/crypto-policies/back-ends/FUTURE/opensshserver.config
/usr/share/crypto-policies/back-ends/LEGACY/libssh.config
/usr/share/crypto-policies/back-ends/LEGACY/openssh.config
/usr/share/crypto-policies/back-ends/LEGACY/opensshserver.config
/usr/share/man/man5/ssh_config.5.gz
/usr/share/man/man5/sshd_config.5.gz
执行的输出显示所有包含这两部分的结果,因为我搜索的是ssh而不是sshd,结果的内容比第一次搜出来的要多很多。
请注意,并非所有系统都安装了locate实用程序,而且许多系统没有启用它。Locate是快速有效的,因为它定期扫描您的系统并缓存其中每个文件的名称和位置,但如果该数据收集未启用,则它不能告诉您任何信息。你可以使用updatedb手动初始化文件系统扫描,以便更新文件系统上缓存的文件信息。
如果有的发行版本中没有安装locate这个查找工具,也可以使用find工具:
[demouser@vbox ~]$ sudo find / -name sshd_config -print
find: ‘/run/user/1000/gvfs’: 权限不够
find: ‘/run/user/1000/doc’: 权限不够
/etc/ssh/sshd_config
上面的命令全局搜索磁盘查找名为sshd_config的文件或目录。但因为每次运行时都必须扫描你的文件系统,而不是使用缓存的数据。这就导致了效率低下和速度慢,但更实时。find实用程序的功能远不止查找文件,但对其功能的完整描述超出了本示例的范围。
如果您对我的文章有兴趣,我把我发布的文章都归档到我私人网站中去,欢迎访问 Corner 三的小角落 -- 首页 查阅之前的文章。
- 上一篇: Linux环境中FTP服务的安装与配置
- 下一篇: 一行代码如何隐藏 Linux 进程?
猜你喜欢
- 2024-11-21 Linux 汇编语言开发指南
- 2024-11-21 不小心删除/etc/passwd文件怎么办
- 2024-11-21 Linux | awk 特殊模式“BEGIN 和 END”
- 2024-11-21 Linux 网络编程——libpcap详解
- 2024-11-21 Linux Bash Shell学习之流程控制——if/else
- 2024-11-21 linux如何切换用户
- 2024-11-21 Linux系统常用命令
- 2024-11-21 Linux系统编程-02、进程
- 2024-11-21 Linux命令中特殊符号
- 2024-11-21 一行代码如何隐藏 Linux 进程?
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)