管道和链接命令
如何链接两个或多个命令
在bash下,可以通过下列操作符创建一个包含多个命令的命令序列。
链接命令
操作符 | 语法 | 说明 | 示例 |
---|---|---|---|
; | command1; command2 | 分隔按顺序执行的命令。 | date ; pwd pwd只在date命令完成后才执行。 |
& | command arg & | shell在后台的子shell中执行该命令。shell不等待命令完成,返回状态为0。&操作符在后台运行命令,同时释放终端以执行其他工作。 | find / -iname "*.pdf" >/tmp/output.txt & find命令在后台执行,同时释放shell提示符。 |
&& | command1 && command2 | 当且仅当,command1返回0退出状态时,才执行command2,也就是说,只有当第一个command1运行成功时,才运行command2。 | [ ! -d /backup ] && mkdir -p /backup 如果/backup目录不存在,则创建 |
|| | command1 || command2 | 当且仅当command1返回一个非零的退出状态时,才执行command2,也就是说,只有当第一个命令失败时,才运行command2。 | tar cvf /dev/st0 /home || mail -s 'Backup failed' [email protected] </dev/null |
| | command1 | command2 | Linux shell管道, 将command1的标准输出连接到command2的标准输入。 |
多个命令
可以使用**分号;**来构建命令序列。
语法
command1 ; command2 ; commandN
或者
{ command1; command2 }
通过这种方式,您可以一个接一个地运行命令。
如果不用分号;, 与号字符(&&操作符)也可以连接多个命令:
[ $# -eq 0 ] && { echo -e "Usage:if [ $# -eq 0 ] then echo -e "Usage:num1 op num2\n\twatch -n 5 'df /tmp; ls -lASFt /tmp'num1 op num2\n\tcommand & command arg1 arg2 & command1 | command2 arg1 & command1 | command2 arg1 > output &1 + 5" exit 1; fifind /nas -name "*.conf" > /tmp/filelist.txt &1 + 5"; exit 1; }
等同于
[1] 1001
示例
使用watch命令每5秒监控临时文件系统(/tmp):
[1]+ Done find /share/ -name "*.conf" > /tmp/filelist
后台运行任务
任务控制
- bash shell允许你使用称为作业控制的工具在后台运行任务(或命令)。
- 作业控制是指有选择地停止、暂停进程的执行,并在稍后的时间继续(恢复)它们的执行的能力。
- 用户通常通过系统的终端驱动程序和bash联合提供的交互界面来使用此功能。
任务
受任务控制设施影响的进程称为任务。
每个任务都有一个惟一的id,称为任务编号。
你可以使用以下命令来控制任务:
- fg-把任务放置到前台。
- bg-把任务放置到后台。
- jobs在屏幕上列出活动任务。
后台进程
- 不按顺序调度的命令称为后台进程。
- 你不能在屏幕上看到后台进程。例如,Apache httpd服务器在后台运行,为web页面提供服务。您可以将shell脚本或任何命令放在后台。
前台进程
可以在屏幕上看到的命令称为前台进程。
如何把命令放在后台?
语法
command1 | command2 command1 | command2 | commandN command1 arg1 | command2 arg1 arg2 get_data_command | verify_data_command | process_data_command | format_data_command > output.data.file get_data_command < input.data.file | verify_data_command | process_data_command | format_data_command > output.data.file
- &操作符用于把命令放在后台,释放你的终端。
- 在后台运行的命令称为任务。
- 可以在后台命令运行时输入其他命令。
示例
ls | grep "data.txt"
输出
ls|grep "data.txt"
find命令现在在后台运行。当bash在后台启动作业时,它将打印一行代码,其中显示作业编号([1])和进程标识号(PID - 1001)
当任务完成后会向终端发送一条消息,如下所示:
ps aux | grep httpd > /tmp/ps.output.log
管道
shell管道是一种不需要任何临时文件,将一个程序的输出连接到另一个程序的输入的方法。
语法
ls -l | more
- 连接两个程序的数据路径称为管道。
- 竖线(
|
)是管道符号。 - 您可以使用管道同时连接两个或多个命令。
- 还允许在管道中重定向。
如何使用管道连接程序
在两个命令之间使用竖线(|)。
例如,将ls命令输出发送到grep命令,即在当前工作目录中查看data.txt文件是否存在:
who | sort who | sort > sorted_list.txt
竖线前后的空格是可选的:
who | wc -l
可以重定向管道输出到一个文件
echo "shutdown -h now" | at 12am tomorrow
示例
示例- 暂停ls命令输出
将ls命令的输出作为输入发送到more命令。因此,输出时一次只打印一个屏幕页:
tar zcvf - /home | ssh user@server "cat > /backup/data_fs-20100305.tar.gz"
示例- 排序并显示已登录用户列表
v="Unix Shell"; echo $v | tr '[:lower:]' '[:upper:]' echo 'tHiS IS a Shell Script' | tr '[:upper:]' '[:lower:]'
示例- 如何统计已登录用户数
tr -dc A-Za-z0-9_ < /dev/urandom | head -c12 | xargs
示例- linux如何定时关机
ls -l | wc -l
示例- linux如何远程备份
command1 < input.txt | command2 command1 < input.txt | command2 arg1 | command3
示例- linux shell如何将字符串转换为大写
示例- linux shell如何将字符串转换为小写
sort < input.txt | grep something sort < input.txt | uniq | grep something
示例- linux shell如何生成随机密码
command1 | command2 > output.txt command1 | command2 arg1 > output.txt command1 < input.txt | command2 > output.txt command1 < input.txt | command2 arg1 arg2 | command3 arg1 > output.txt
示例- linux shell如何统计目录的文件数量
ps -e -orss=,args= | sort -b -k1,1n > memory.txt
在管道中的输入重定向
**输入重定向符号<**可以与管道一起使用,以便从文件中获取输入:
##代码##例如,sort命令将从/etc/passwd文件获得输入,该文件通过管道传输到grep命令:
##代码##在管道中的输出重定向
使用 >或者>>重定向符号的管道可以将最后一个命令的标准输出进行重定向。
语法是
例如:linux如何排序所有进程的内存大小,并将保存输出到memory.txt文件:
##代码##