管道和链接命令

时间:2019-04-16 23:59:05  来源:igfitidea点击:

如何链接两个或多个命令

在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 | command2Linux shell管道, 将command1的标准输出连接到command2的标准输入。

多个命令

可以使用**分号;**来构建命令序列。

语法

command1 ; command2 ; commandN

或者

{ command1; command2 }

通过这种方式,您可以一个接一个地运行命令。

如果不用分号;, 与号字符(&&操作符)也可以连接多个命令:

[ $# -eq 0 ] && { echo -e "Usage: 
if [ $# -eq 0 ] 
then
   echo -e "Usage: 
watch -n 5 'df /tmp; ls -lASFt /tmp'
num1 op num2\n\t
command &
command arg1 arg2 &
command1 | command2 arg1 &
command1 | command2 arg1 > output &
1 + 5" exit 1; fi
num1 op num2\n\t
find /nas -name "*.conf" > /tmp/filelist.txt &
1 + 5"; exit 1; }

等同于

[1] 1001

示例

使用watch命令每5秒监控临时文件系统(/tmp):

[1]+  Done  find /share/ -name "*.conf" > /tmp/filelist

后台运行任务

任务控制

  1. bash shell允许你使用称为作业控制的工具在后台运行任务(或命令)。
  2. 作业控制是指有选择地停止、暂停进程的执行,并在稍后的时间继续(恢复)它们的执行的能力。
  3. 用户通常通过系统的终端驱动程序和bash联合提供的交互界面来使用此功能。

任务

受任务控制设施影响的进程称为任务。
每个任务都有一个惟一的id,称为任务编号。
你可以使用以下命令来控制任务:

  1. fg-把任务放置到前台。
  2. bg-把任务放置到后台。
  3. 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
  1. &操作符用于把命令放在后台,释放你的终端。
  2. 在后台运行的命令称为任务。
  3. 可以在后台命令运行时输入其他命令。

示例

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
  1. 连接两个程序的数据路径称为管道。
  2. 竖线(|)是管道符号。
  3. 您可以使用管道同时连接两个或多个命令。
  4. 还允许在管道中重定向。

如何使用管道连接程序

在两个命令之间使用竖线(|)。

例如,将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文件:

##代码##