Skip to main content

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 结尾。

环境加载

切换用户时,会涉及环境加载

示例:

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.txtfile2.txt 等。

[...](方括号):

  • 匹配方括号内的任何一个字符。例如,file[123].txt 可以匹配 file1.txtfile2.txtfile3.txt

[!...][^...]

  • 匹配不在方括号内的任何一个字符。例如,file[^23].txt 可以匹配 file1.txtfile4.txt,但不匹配 file2.txtfile3.txt

{...}

  • 用于扩展成一个由逗号分隔的字符串列表。例如,{jpg,png} 可以匹配 file.jpgimage.png

常用快捷键

光标移动

ctrl + A      移动到开头
ctrl + E 移动到结尾

删除

ctrl + K      删除光标后所有字符(剪切)
ctrl + U 删除光标前所有字符(剪切)

撤销

ctrl + _      撤销操作
ctrl + Y 粘贴ctrl+U/K剪切的内容

控制命令

ctrl + L      清除屏幕
ctrl + C 终止命令
ctrl + Z 挂起

!命令

!!            执行上条命令
!-n 执行前n条命令

https://wesley.blog.csdn.net/category_9829619_3.html

https://blog.csdn.net/u011436427/article/details/103815680

https://wesley.blog.csdn.net/article/details/105425049