1.几个shell特性
Login和Nologin
当涉及到Linux系统中的用户登录时,/etc/passwd 文件中的每个用户都有一个指定的登录 shell(login shell)。
登录 shell 是用户登录时默认启动的命令行解释器。
在这个过程中,还有一个文件 /etc/shells,其中包含了系统中允许用户使用的合法登录 shell 的列表。
Login shell
登录shell 涉及到两个文件
- /etc/passwd
- /etc/shells
/etc/passwd
/etc/passwd包含了系统中所有用户的账户信息,每一行代表一个用户。每行包含了一系列以冒号分隔的字段,其中第七个字段即为用户的登录 shell。
john:x:1000:1000:John Doe:/home/john:/bin/bash
/bin/bash 表示 John Doe 的登录 shell 是 Bash。
/etc/shells
/etc/shells 文件列出了系统中允许的合法登录 shell,每行一个。这个文件的存在主要是为了安全性考虑,限制系统上可用的 shell。
#/etc/shells
/bin/bash
/bin/sh
/bin/zsh
nologin shell
你可能希望某些用户无法登录系统,但仍然保留其用户账户。这时,可以将这些用户的登录 shell 设置为 /sbin/nologin。
/sbin/nologin 实际上是一个程序,当用户尝试登录时,它会显示一个拒绝登录的消息,而不是提供一个实际的命令行解释器。
john:x:1000:1000:John Doe:/home/john:/sbin/nologin
这会阻止 John Doe 登录系统,但仍然保留了他的用户账户。
工作环境
- 指的是操作系统和用户之间的工作环境,包括各种配置、变量和设置,以确保系统和用户能够正常工作。
- 工作环境又分为用户环境和系统环境。
用户环境(User Environment)
主要环境配置文件有:
/.bashrc 或 ~/.bash_profile 或 ~/.profile
- 这些文件通常包含用户登录时执行的命令和配置信息,例如设置环境变量、别名、自定义函数等。不同的发行版和系统可能使用不同的文件名。
~/.bash_history:
- 保存用户在命令行中输入的历史命令记录。
~/.bash_logout:
- 包含用户注销时执行的命令。
系统环境(System Environment)
常用环境配置文件:
-
/etc/profile:- 系统范围的配置文件,包含系统范围的环境变量和全局配置。
-
/etc/bashrc:- 包含系统范围的 Bash 配置,对所有用户的 Bash shell 都生效。
-
/etc/profile.d/目录:- 包含系统范围的 shell 脚本片段,这些脚本会在用户登录时被执行。文件名通常以
.sh结尾。
- 包含系统范围的 shell 脚本片段,这些脚本会在用户登录时被执行。文件名通常以
环境加载
切换用户时,会涉及环境加载
示例:
su - wesley #login shell
su wesley #nologin shell
登陆(加杠 -)的shell,执行四个文件
- /etc/profile
- /etc/bashrc
- /.bash_profile
- /.bashrc
非登录(不加杠)shell,只执行2个文件
- /etc/bashrc
- ~/.bashrc
输入输出重定向
输出重定向
>:将命令的标准输出重定向到文件。如果文件不存在,则会创建文件;如果文件已经存在,则会覆盖文件内容。
>>:将命令的标准输出追加到文件。如果文件不存在,则会创建文件;如果文件已经存在,则将内容追加到文件末尾。
echo "Hello, World!" > output.txt
echo "Appended text" >> output.txt
输入重定向
<:将文件内容作为命令的标准输入。命令从指定文件读取数据。
<<:允许将多行文本作为输入传递给命令。可以在脚本中直接嵌入文本。
command < input.txt
cat << EOF
This is a multiline
text block passed as input.
EOF
cat << EOF >> test.txt #将多行文本写入到test.txt
This is a multiline
text block passed as input.
EOF
重定向标准错误
2>:将命令的标准错误输出重定向到文件。
2>>:将命令的标准错误输出追加到文件。
command 2> error.log
command 2>> error.log
重定向标准输出和标准错误到同一文件:
command > output_and_error.log 2>&1
将标准输出重定向到文件 output_and_error.log,同时将标准错误也重定向到该文件。
管道(pipeline)
- 允许将一个命令的输出传递给另一个命令作为输入。
- 使用竖线符号
|来表示管道。 - 通过管道,你可以将多个命令串联在一起,形成一个数据处理流水线。
command1 | command2 | command3 | ...
这将命令1的输出作为命令2的输入,命令2的输出作为命令3的输入,以此类推。
示例:
#!/bin/bash
# 列出当前目录下的文件,并通过管道传递给 `grep` 命令过滤包含 "txt" 的文件
ls -l | grep "txt"
示例2:统计一个日志文件中包含特定关键词的行数
#!/bin/bash
# 统计日志文件中包含 "error" 的行数
cat logfile.txt | grep "error" | wc -l
命令排序
;
- 如果一行有多个命令,就要用分号(;)分隔开
- 分号仅仅是命令的排序,没有逻辑判断机制。即使第一条语句执行失败,第二条也可以执行。
&&
-
表示第一条语句执行成功后才执行第二条语句,同理,第二条语句执行成功后才执行第三条语句。
-
具备逻辑判断
./configure && make && make install
||
- 表示第一条语句执行失败后才执行第二条语句,只有前一句返回值失败时才执行后一条语句。
- 具备逻辑判断
其他:
command & #后台执行
command &>/dev/null #混合重定向
()
-
放在子shell中执行
(ls)
通配符
通配符是一种用于匹配文件名或字符串的特殊字符。
*(星号):
- 匹配任意长度的字符(包括零长度)。例如,
*.txt可以匹配所有以.txt结尾的文件。
?(问号):
- 匹配任意单个字符。例如,
file?.txt可以匹配file1.txt、file2.txt等。
[...](方括号):
- 匹配方括号内的任何一个字符。例如,
file[123].txt可以匹配file1.txt、file2.txt或file3.txt。
[!...] 或 [^...]:
- 匹配不在方括号内的任何一个字符。例如,
file[^23].txt可以匹配file1.txt或file4.txt,但不匹配file2.txt或file3.txt。
{...}:
- 用于扩展成一个由逗号分隔的字符串列表。例如,
{jpg,png}可以匹配file.jpg或image.png。
常用快捷键
光标移动
ctrl + A 移动到开头
ctrl + E 移动到结尾
删除
ctrl + K 删除光标后所有字符(剪切)
ctrl + U 删除光标前所有字符(剪切)
撤销
ctrl + _ 撤销操作
ctrl + Y 粘贴ctrl+U/K剪切的内容
控制命令
ctrl + L 清除屏幕
ctrl + C 终止命令
ctrl + Z 挂起
!命令
!! 执行上条命令
!-n 执行前n条命令
Reference Link:
https://wesley.blog.csdn.net/category_9829619_3.html