深入探索Bash shell:重定向、扩展与常用命令
1. 标准错误输出重定向
在Bash shell中,标准输入和标准输出通常指的是键盘和屏幕,这是程序默认的输入输出方式。不过,当程序出错时,错误信息一般不会作为标准输出的一部分,而是通过标准错误输出显示,通常也会出现在屏幕上。
有时候,将错误信息捕获到文本文件中是很有用的,这可以通过重定向标准错误输出来实现,方法和重定向标准输出类似。例如:
wodim --scanbus 2> errormessage.txt
wodim
命令用于刻录CD,
--scanbus
选项让它搜索系统中的CD - R/RW驱动器。如果系统配置不当,这个操作常常会产生错误信息。在命令后面,使用
2>
来重定向标准错误输出,而不是简单的
>
,这实际上是告诉Bash使用第二种输出类型,即标准错误。
也可以将标准输出和标准错误输出都定向到同一个文件,示例如下:
cdrecord --scanbus > error.txt 2>&1
这个操作稍微复杂一些。
wodim --scanbus
的标准输出会被发送到
error.txt
文件,第二个重定向命令告诉Bash将标准错误包含在标准输出中。也就是说,不是先将标准输出写入文件,再添加标准错误,而是Bash先将标准错误添加到标准输出,然后一起写入文件。
2. 使用花括号扩展
在命令行中,花括号扩展是一种非常实用的省力技巧。简单来说,花括号
{}
内的内容会被替换到指定的文件名中。例如,下面的命令会创建名为
PhotosGermany
、
PhotosEngland
和
PhotosSpain
的新目录:
mkdir Photos{Germany,England,Spain}
实际上,
mkdir
命令将
Photos
与
Germany
、
England
和
Spain
组合,创建了三个新目录。
如果还想创建一个名为
Photos
的目录(后面没有国家名称),可以通过在花括号内指定一个前面没有内容的逗号来实现。示例如下:
mkdir Photos{,Germany,England,Spain}
$ ls
Photos PhotosEngland PhotosGermany PhotosSpain
此外,还可以使用两个点
..
来指定数字或字母范围的扩展,这和通配符中使用破折号表示范围不同。例如,下面的命令会创建从
PhotosA
到
PhotosZ
的目录:
mkdir Photos{A..Z}
3. Bash命令索引
这里介绍一些在Bash shell中常用的命令,这些命令是日常桌面系统中经常会用到的。每个命令的描述都比较简单,并且带有星号
*
的命令功能通常比简要描述的要多,建议查看其手册页获取更多信息。
3.1 命令列表约定
- 当出现斜体字时,需要替换为自己的具体信息。
-
普通用户可以运行的命令前面带有美元符号
$。 -
需要root权限(使用
sudo)的命令前面带有井号#。 - 对系统有潜在危险的命令会明确标记,使用前需要研究其用法和功能。
3.2 常见Bash命令
| 命令 | 描述 | 典型命令选项 | 使用示例 |
|---|---|---|---|
$ alias
| 创建或显示命令别名 |
alias list =ls
| |
$ alsamixer
| 调整音频音量级别 |
alsamixer
| |
$ apropos
| 在手册页中搜索指定的单词或短语 |
apropos "word or phrase"
| |
$ apt-cache
| 搜索、查询和操作APT数据库缓存 |
search
:搜索指定包;
showpkg
:显示指定包的信息;
depends
:显示指定包的依赖关系
|
apt-cache search packagename
|
# apt-get
| 多功能工具,用于安装、删除和管理软件包 |
install
:从仓库安装指定包;
update
:更新或构建包数据库;
upgrade
:尝试升级所有已安装的包;
dist-upgrade
:积极解决包冲突并升级所有已安装的包;
remove
:删除包;
clean
:删除旧的包安装文件;
-f
:尝试修复损坏的包依赖;
force-yes
:绕过保护措施(危险)
|
apt-get install packagename
|
$ bzip2
| 压缩指定文件 |
-d
:解压缩文件;
-k
:不删除原始文件;
-t
:进行测试而不写入数据
|
bzip2 myfile
|
$ bzip2 recover
|
尝试恢复损坏的
.bz2
文件
|
bzip2recover myfile.tar.bz2
| |
$ cal
| 显示当前月(或指定月/年)的日历 |
cal 4 2005
| |
$ cat
| 在屏幕上显示文件或合并显示两个文件 |
cat myfile
| |
$ cd
| 切换到指定目录 |
cd /usr/bin
| |
$ cdparanoia *
| 将CD音频轨道转换为硬盘文件 |
-B
:批量模式;
-S
:设置CD读取速度
|
cdparanoia -S 8 -B
|
# wodim *
| 刻录音频或CD - R/RW数据光盘 |
-dev=
:指定驱动器设备号;
scanbus
:扫描CD - R/RW驱动器;
-speed=
:指定写入速度;
-v
:详细输出
|
wodim dev=0,0,0 -speed=16 -v myfile.iso
|
# cfdisk *
| 危险!基于菜单的磁盘分区程序 |
cfdisk /dev/hda
| |
# chgrp
| 更改文件/目录的组所有权 |
-R
:递归应用更改到子目录
|
chgrp mygroup myfile
|
$ chmod
| 更改文件/目录的权限 |
-R
:递归应用到子目录;
reference=
:从指定文件复制权限
|
chmod a+rw myfile
|
$ chown
| 更改文件所有权到指定用户名 |
-R
:递归应用到子目录
|
chown username myfile1
|
# chroot
| 将文件系统的根更改为指定路径 |
chroot / home / mydirectory
| |
# chvt
| 切换到指定的虚拟终端 |
chvt 3
| |
$ clear
| 清除终端屏幕并将光标置于顶部 |
clear
| |
$ cp
| 复制文件 |
-r
:递归复制子目录和其中的文件;
-s
:创建符号链接而不是复制
|
cp myfile1 directory/
|
$ crontab
| 编辑或显示用户的crontab文件(定时任务) |
-e
:编辑crontab文件;
-l
:列出crontab条目;
-r
:删除crontab文件;
-u
:指定用户并编辑其crontab文件
|
crontab -e
|
$ date
| 显示日期和时间 |
date
| |
$ df
| 显示文件系统中的可用磁盘空间 |
-h
:以人类可读的格式显示;
-l
:限制为本地文件系统
|
df -h
|
$ diff
| 显示指定文件之间的差异 |
-a
:将所有文件视为文本文件;
-i
:忽略大小写差异;
-s
:抑制关于不可访问文件的错误信息
|
diff myfile1 myfile2
|
$ diff3
| 显示三个指定文件之间的差异 |
diff3 myfile1 myfile2 myfile3
| |
$ dig
| 查找指定域名的IP地址 |
dig mysite.com
| |
$ dmesg
| 显示内核消息日志 |
dmesg
| |
# dosfsck *
| 检查和修复基于MS - DOS的硬盘分区 |
-a
:自动修复;
-r
:修复时询问用户确认;
-v
:详细输出
|
dosfsck -rv /dev/hda4
|
# dpkg
| 安装、删除和管理本地安装包 |
-i
:安装指定包;
-r
:删除指定包;
-I
:显示指定包的信息;
ignore - depends = packagename.deb
:忽略包依赖问题(危险)
|
dpkg –i packagename.deb
|
# dpkg - reconfigure
| 重新配置已安装的包 |
dpkg - reconfigure packagename
| |
$ du
| 显示文件和文件夹的大小(以千字节为单位) |
-h
:以人类可读的格式输出;
-s
:只显示目录的总计
|
du -h / home / myuser
|
$ eject
| 弹出可移动存储磁盘 |
-t
:关闭已打开的托盘
|
eject / media / dvd - rom
|
$ ex *
| 启动一个主要用于shell脚本的简单文本编辑器程序 |
ex myfile.txt
| |
$ exit
| 退出shell(结束会话) |
exit
| |
$ fdformat
| 对软盘进行低级格式化(不会创建文件系统) |
fdformat /dev/fd0
| |
# fdisk *
| 危险!硬盘分区程序 |
-l
:列出分区表
|
fdisk /dev/hda
|
$ fg
| 将后台运行的作业移到前台 |
fg 1
| |
$ file
| 显示指定文件的信息,如文件类型 |
file myfile
|
下面是这些操作的流程图:
graph TD;
A[开始] --> B[重定向标准错误输出]
B --> C[使用花括号扩展]
C --> D[使用常见Bash命令]
D --> E[结束]
3.3 常见Bash命令(续)
| 命令 | 描述 | 典型命令选项 | 使用示例 |
|---|---|---|---|
$ find *
| 通过搜索目录查找文件(从当前目录开始) |
-maxdepth
:指定子目录的搜索深度;
-name
:指定要搜索的文件名;
-type
:指定要返回的文件类型
|
find -name "myfile"
|
$ free
| 显示内存使用信息 |
-m
:以MB为单位显示;
-t
:在表格底部显示总计
|
free -m
|
# fsck *
| 检查文件系统是否有错误(通常从救援盘运行) |
fsck /dev/hda1
| |
$ ftp *
| 用于上传/下载到远程站点的FTP程序 |
ftp ftp.mysite.com
| |
$ fuser
| 显示正在使用特定文件或文件系统的进程 |
-v
:详细输出
|
fuser -v myfile
|
$ genisoimage *
|
从指定目录创建ISO镜像文件(通常用于使用
wodim
刻录光盘)
|
-o
:指定输出文件名;
-apple
:使用Mac OS扩展;
-f
:跟随符号链接;
-J
:使用Joliet扩展;
-R
:使用Rock Ridge扩展;
-v
:详细输出
|
mkisofs -o isoimage.iso -R -J -v mydirectory
|
$ grep *
| 在指定文件中搜索指定的文本字符串或单词 |
-i
:忽略大小写差异;
-r
:递归搜索子目录;
-s
:抑制关于不可访问文件的错误消息
|
grep "phrase I want to find" myfile.txt
|
# groupadd
| 创建新组 |
groupadd mygroup
| |
# groupdel
| 删除指定组 |
groupdel mygroup
| |
$ groups
| 显示指定用户所属的组 |
groups myuser
| |
$ gzip
| 压缩文件并替换原始文件 |
-d
:解压缩文件;
-v
:详细显示压缩程度
|
gzip myfile
|
# halt
| 启动关机程序,结束所有进程并卸载所有磁盘 |
-p
:关机后关闭电源
|
halt -p
|
# hdparm *
| 危险!调整或查看硬盘设置 |
hdparm /dev/hda
| |
$ head
| 打印文本文件的前几行(默认前10行) |
-n
:指定行数
|
head myfile.txt
|
$ help
| 显示常见Bash命令列表 |
help
| |
$ history
| 显示历史文件(最近使用的命令列表) |
history
| |
$ host
| 根据指定的域名或IP地址查询DNS服务器 |
-d
:详细输出;
-r
:强制名称服务器返回缓存信息
|
host 82.211.81.166
|
$ hostname
| 显示计算机的本地主机名 |
hostname
| |
$ id
| 显示指定用户的用户名和组信息(如果未指定则为当前用户) |
id myuser
| |
# ifconfig *
| 显示或配置网络接口的设置 |
down
:禁用接口;
netmask
:指定子网掩码;
up
:启用接口
|
ifconfig eth0 192.168.0.10 netmask 255.255.0.0 up
|
$ info *
| 显示指定命令的信息页面 |
info command
| |
# init
| 更改当前运行级别 |
init 1
| |
$ jobs
| 显示后台运行的作业列表 |
jobs
| |
$ kill
| 终止指定进程 |
kill 1433
| |
$ killall
| 终止具有指定名称的进程 |
-i
:终止前确认;
-v
:详细报告
|
killall processnumber
|
$ last
| 显示最近的登录、重启和关机详细信息 |
last
| |
$ ldd
| 显示指定程序所需的系统文件(库) |
ldd /usr/bin/program
| |
$ less
| 交互式滚动浏览文本文件 |
-q
:安静模式;
-i
:忽略大小写
|
less myfile.txt
|
$ ln
| 创建指定文件的链接,如符号链接 |
-s
:创建符号链接(默认是硬链接)
|
ln -s myfile1 myfile2
|
$ lpr
| 打印文件(发送到打印机队列) |
-V
:详细显示打印作业进度
|
lpr myfile.txt
|
$ lpstat
| 显示打印队列 |
Lpstat
| |
$ ls
| 列出目录内容 |
-a
:列出所有文件,包括隐藏文件;
-d
:只列出目录名;
-h
:以人类可读的格式显示;
-l
:长列表格式;
-m
:以逗号分隔的列表显示
|
ls -h mydirectory
|
# lsmod
| 显示当前加载的内核模块 |
Lsmod
| |
$ lsof
| 显示当前正在使用的文件 |
-u
:限制结果为指定用户使用的文件
|
lsof -u username
|
$ man
| 显示指定命令的手册 |
man command
| |
$ md5sum
| 显示MD5校验和(通常用于下载后确认文件完整性) |
md5sum myfile
| |
# mkfs *
| 危险!在指定设备上创建指定的文件系统 |
-t
:指定文件系统类型
|
mkfs -t vfat /dev/fd0
|
# modinfo
| 显示内核模块的信息 |
modinfo modulename
| |
# modprobe
| 将指定模块插入内核,以及其依赖的其他模块 |
-k
:设置模块的自动清理标志;
-r
:移除指定模块及其依赖
|
modprobe modulename
|
$ more
|
交互式滚动浏览文本文件(类似于
less
)
|
more myfile.txt
| |
# mount *
| 在指定位置挂载指定的文件系统 |
-o
:指定命令选项,如
rw
允许读写访问
|
mount /dev/hda4 /mnt
|
$ mv
| 移动(或重命名)指定的文件和/或目录 |
-b
:移动前备份文件;
-v
:显示操作细节
|
mv myfile mydirectory/
|
$ netstat *
| 显示当前的网络连接 |
netstat –a
| |
$ nice
| 以指定优先级运行指定命令 |
-n
:指定优先级,范围从 -20(最高)到 19(最低)
|
nice -n 19
|
$ nohup
| 运行指定命令,即使用户注销也继续运行 |
nohup command
| |
$ passwd
| 更改用户密码 |
Passwd
| |
$ ping
| 检查本地机器与指定地址之间的网络连接 |
-w
:指定秒数后退出
|
ping mydomain.com
|
$ printenv
| 显示当前用户的所有环境变量 |
Printenv
| |
$ ps *
| 显示当前正在运行的进程 |
a
:列出所有进程;
f
:以树状图形显示进程所有权;
u
:限制结果为当前用户运行的进程;
x
:包括非用户启动但以用户ID运行的进程
|
ps aux
|
$ pwd
| 显示当前目录 |
Pwd
| |
# reboot
| 重启计算机 |
Reboot
| |
$ renice
| 在进程运行时更改其优先级 |
renice 19 10704
| |
$ rm
| 删除单个或多个文件和/或目录 |
-r
:递归删除指定目录及其子目录;
-f
:强制删除,不提示确认(谨慎使用)
|
rm -rf mydirectory
|
# rmmod
| 从内核中删除模块 |
rmmod modulename
| |
# route *
| 添加、创建(或查看)路由表条目 |
route add default gw 192.168.1.1
| |
$ runlevel
| 显示当前运行级别 |
runlevel
| |
$ screen *
| 运行一个伪shell,即使用户登录状态改变也保持运行 |
-ls
:显示当前运行的屏幕会话列表;
-R
:重新连接到已运行的屏幕会话或启动新会话
|
screen
|
$ sftp *
| 安全的FTP程序,通过SSH连接运行 |
sftp username@192.168.1.14
| |
$ shred
| 用乱码覆盖文件数据,使其不可恢复 |
-u
:覆盖后删除文件;
-v
:详细显示过程;
-f
:必要时强制更改权限以允许写入
|
shred -fv myfile
|
$ sleep
|
暂停输入指定的时间(
s
表示秒,
m
表示分钟,
h
表示小时,
d
表示天)
|
sleep 10m
| |
$ smbclient *
| 类似FTP的程序,用于登录基于SMB(Windows)的文件共享 |
smbclient //192.168.1.1/
| |
$ sort
| 对指定文本文件中的条目进行排序(默认按ASCII排序) |
sort myfile.txt -o sorted.txt
| |
$ ssh *
| 使用安全shell登录到远程计算机 |
ssh username@192.168.1.15
| |
$ startx
| 启动GUI会话(如果GUI尚未运行) |
startx
| |
$ su
| 临时以指定用户身份登录;如果未指定用户,则以root身份登录(前提是root账户已激活) |
-
:采用用户的环境变量
|
su
|
$ sudo
| 以root权限执行指定命令 |
sudo command
| |
$ tac
| 反向显示指定的文本文件(从最后一行到第一行) |
tac myfile.txt
| |
$ tail
| 显示指定文本文件的最后几行 |
-n
:指定显示的行数
|
tail myfile.txt
|
$ tar *
| 将指定的文件和/或目录合并为一个较大的文件,或从这样的文件中提取内容 |
-c
:创建新存档;
-j
:使用bzip2压缩(或解压缩)文件;
-f
:指定文件名;
-r
:向现有存档中添加文件;
-x
:从现有存档中提取文件;
-z
:使用gzip压缩(或解压缩)文件
|
tar -zcf myfile.tar.gz mydirectory
|
$ tee
| 显示管道输出并将其保存到指定文件 |
ls -lh| tee listing.txt
| |
$ top *
| 显示并允许用户操作进程的程序 |
top
| |
$ touch
| 为指定文件设置当前时间和日期戳;如果文件不存在,则创建一个零字节的文件 |
touch myfile
| |
$ tracepath
| 发现并显示到另一个主机的网络路径 |
tracepath 192.168.1.20
| |
$ umask
| 设置新创建文件的默认权限 |
umask u=rwx,g=r,o=
| |
# umount
| 卸载文件系统 |
umount /media/cdrom
| |
# useradd
| 添加新用户 |
-m
:为用户创建主目录
|
useradd -m username
|
# userdel
| 从系统配置文件中删除用户的所有信息(实际上删除用户,但用户拥有的文件可能仍然存在) |
-r
:删除用户的
/home
目录
|
userdel -r username
|
$ unalias
| 删除指定的别名 |
-a
:删除所有别名(谨慎使用)
|
unalias command
|
$ uname
| 显示当前系统的技术信息 |
-a
:显示所有基本信息
|
uname –a
|
$ unzip
| 解压Windows兼容的Zip文件 |
-l
:显示存档内容但不实际解压
|
unzip myfile.zip
|
$ uptime
| 显示系统的运行时间、CPU负载平均值和登录用户 |
uptime
| |
$ vim *
| 文本编辑器程序 |
vim
| |
$ wc
| 统计文件中的单词数量 |
wc myfile.txt
| |
$ whatis
| 显示指定命令的单行摘要 |
whatis command
| |
$ whereis
| 显示二进制命令的位置,以及其源代码和手册页(如果适用) |
-b
:只返回二进制程序的信息
|
whereis -b command
|
$ xhost
| 配置哪些用户/系统可以在X服务器上运行程序 |
+
:允许指定用户/系统在X服务器上运行程序;
-
:相反操作
|
xhost +
|
$ xinit
| 启动基本的GUI会话(如果GUI尚未运行) |
xinit
| |
$ zip
| 创建Windows兼容的压缩Zip文件 |
-r
:递归包含所有子目录和文件;
-u
:更新Zip文件;
-P
:用指定密码加密Zip文件;
-v
:详细输出;
-#
:设置压缩级别,从0(无压缩)到9(最高)
|
zip -r myfile.zip mydirectory
|
$ zipgrep
| 在Zip文件中搜索指定的文本字符串 |
zipgrep " search phrase myfile.zip
|
下面是使用这些命令的操作步骤总结:
1. 确定要执行的操作,例如重定向输出、创建目录、安装软件等。
2. 根据操作选择合适的命令,参考命令的描述和典型选项。
3. 根据实际情况替换命令中的斜体部分为具体信息。
4. 注意命令的权限要求,普通用户命令使用
$
开头,需要root权限的命令使用
#
开头。
5. 对于危险命令,如
# cfdisk
、
# fdisk
等,在使用前充分了解其功能和影响。
6. 执行命令并根据输出结果进行相应的处理。
通过掌握这些Bash shell的重定向、扩展和常见命令,用户可以更高效地操作和管理系统。无论是日常的文件操作、网络连接检查,还是系统的安装和配置,这些命令都能发挥重要作用。
graph LR;
A[确定操作] --> B[选择命令]
B --> C[替换信息]
C --> D[注意权限]
D --> E[处理危险命令]
E --> F[执行命令]
F --> G[处理结果]
超级会员免费看
17

被折叠的 条评论
为什么被折叠?



