linux重定向和管道符

为什么要使用重定向

1.当屏幕输出的信息很重要,而且我们需要将他存下来的时候;

2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时;

3.系统的例行命令,例如定时任务的执行结果,希望他可以存下来时;

4.一些执行命令,我们已经知道他可能出现错误信息时,想将他直接丢弃时;

例子:

通过脚本自动安装mysql

1)查询mysql是否已经安装

2)未安装就自动安装

rpm -q mysql

//查询mysql是否安装,如果未安装就使用yum安装

[root@localhost ~]# rpm -q mariadb &>/dev/null ||yum install -y mariadb

//查询mysql是否安装,如果已经安装则输出mariadb install

[root@localhost ~]# rpm -q mariadb &>/dev/null && echo 'mariadba install'

mariadba install

;    cmd1;cmd2

cmd1执行完后,再执行cmd2

&&   cmd1 && cmd2

cmd1执行正确后,才会执行cmd2

||      cmd1||cmd2

cmd1执行错误后,才会执行cmd2

5.错误信息与正确信息需要分别输出时。

标准输入和输出

执行一个shell程序时通常会自动打开三个标准文件

标准输入(STDIN,文件描述符为0):通常对应终端的键盘,也可以从其他文件或命令或者文件内容中输入

标准输出(STDOUT,文件描述符为1):默认输出到屏幕。

错误输出(STDERR,文件描述符为2):默认输出到屏幕。

文件名称(filename,文件描述符为3+)

进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而降错误信息送到标准错误文件中。

进程使用文件描述符(file descriptors)来管理打开的文件。

FD:

/proc/pid/fd

以cat命令为例,cat命令的功能是从命令行给出的文件读取数据,并将这些数据直接送到标准输出。若使用以下命令:

[root@localhost ~]# cat /etc/passwd

将会把/etc/passwd的内容依次显示到屏幕上。但如果cat命令行中没有参数,它就会从标准输入中读取数据,并将其送到标准输出。

[root@localhost ~]# cat

asdasda

asdasda

asdasd

asdasd

asdasd

asdasd

输入输出过程检测

//持续追踪查看文件内容

[root@localhost ~]# vim /etc/passwd

ctrl+z 将进程转到后台

//查看运行的进程

[root@localhost ~]# ps

PID TTY          TIME CMD

1495 pts/1    00:00:00 bash

1549 pts/1    00:00:00 vim

1550 pts/1    00:00:00 ps

//查看1549进程下的文件描述符

[root@localhost ~]# ll /proc/1549/fd

总用量 0

lrwx------ 1 root root 64 12月 19 13:52 0 -> /dev/pts/1

lrwx------ 1 root root 64 12月 19 13:52 1 -> /dev/pts/1

lrwx------ 1 root root 64 12月 19 13:50 2 -> /dev/pts/1

lrwx------ 1 root root 64 12月 19 13:52 4 -> /etc/.passwd.swo

//linux查看标准输入输出设备

[root@localhost ~]# ll /dev/std*

lrwxrwxrwx 1 root root 15 12月 19 08:37 /dev/stderr -> /proc/self/fd/2

lrwxrwxrwx 1 root root 15 12月 19 08:37 /dev/stdin -> /proc/self/fd/0

lrwxrwxrwx 1 root root 15 12月 19 08:37 /dev/stdout -> /proc/self/fd/1

输出重定向

重定向:改变标准输入、标准输出的方向的就是重定向

标准覆盖输出重定向>

标准追加输出重定向>>

错误覆盖输出重定向2>

错误追加输出重定向2>>

输入重定向<

类型                           操作符     用途

标准覆盖输出重定向  >          将命令的执行结果输出到指定的文件中,而不是直接显示在屏幕上

标准追加输出重定向  >>        将命令执行的结果追加输出到指定文件

标准输入重定向         <          将命令中接收输入的途径由默认的键盘更改为指定的文件

案例1:标准输出重定向(覆盖)

[root@localhost ~]# hostnamectl >host_info.txt

案例2:标准输出追加重定向

[root@localhost ~]# echo "123">>host_info.txt

[root@localhost ~]# cat host_info.txt

案例3:标准输出错误信息

[root@localhost ~]# cat b >b.txt

cat: b: 没有那个文件或目录

[root@localhost ~]# cat b 2>b.txt

[root@localhost ~]# cat b.txt

cat: b: 没有那个文件或目录

案例4:错误正确的输入到不同的文件

[root@localhost ~]# su - oldboy

上一次登录:日 12月 22 19:33:28 CST 2019pts/0 上

[oldboy@localhost ~]$ find /etc/ -name "*.conf" 1>a 2>b

案例5:错误的正确的都输入到相同的文件中

[root@localhost ~]# ls a.txt c.txt

ls: 无法访问c.txt: 没有那个文件或目录

a.txt

[root@localhost ~]# ls a.txt c.txt &> aaa

[root@localhost ~]# cat aaa

ls: 无法访问c.txt: 没有那个文件或目录

a.txt

[root@localhost ~]# ls a.txt c.txt >aaa 2>1

[root@localhost ~]# ls a.txt c.txt >bbb 2>1

[root@localhost ~]# diff aaa bbb

案例6:像空设备输入信息

[root@localhost ~]# ls /root /error >ab 2>/dev/null

[root@localhost ~]# ls /root /error >ab &>/dev/null

案例7:脚本中使用重定向

写一个脚本,测试主机是否up

[root@localhost ~]# vim ping.sh

ping -c2 10.0.1.31

if [ $? -eq 0 ];then

echo "10.0.1.31 is up"

else

echo "10.0.1.31 is down"

fi

改进后版

[root@localhost ~]# vim ping.sh

ping -c2 10.0.1.31 &> /dev/null

if [ $? -eq 0 ];then

echo "10.0.1.31 is up"

else

echo "10.0.1.31 is down"

fi

[root@localhost ~]# sh ping.sh

10.0.1.31 is up

最终版

[root@localhost ~]# vim ping.sh

ping -c2 $1 &> /dev/null

if [ $? -eq 0 ];then

echo "$1 is up"

else

echo "$1 is down"

fi

[root@localhost ~]# sh ping.sh 10.0.1.23

10.0.1.23 is down

[root@localhost ~]# sh ping.sh 10.0.1.251

10.0.1.251 is down

[root@localhost ~]# sh ping.sh 10.0.1.31

10.0.1.31 is up

3.输入重定向

标准输入 < 等价0<

案例1:发邮件

//1.安装所需软件包

[root@localhost ~]# yum install -y sendmail mailx

sendmail 邮件服务器

mailx 邮件客服端,提供mail命令

//2.启动sendmail服务

[root@localhost ~]# systemctl start sendmail

//3.使用mail发邮件

[root@localhost ~]# mail oldboy

Subject: test

hello world

. //结束

EOT

注意:

修改/etc/hosts文件,添加主机名和IP地址对应关系

//切换用户,收邮件

[oldboy@localhost ~]$ mail

Heirloom Mail version 12.5 7/5/10.  Type ? for help.

"/var/spool/mail/oldboy": 1 message 1 new

>N  1 root                  Mon Dec 23 21:18  20/780   "test"

& 1

Message  1:

From root@localhost.localdomain  Mon Dec 23 21:18:37 2019

Return-Path: <root@localhost.localdomain>

From: root <root@localhost.localdomain>

Date: Mon, 23 Dec 2019 21:18:37 +0800

To: oldboy@localhost.localdomain

Subject: test

User-Agent: Heirloom mailx 12.5 7/5/10

Content-Type: text/plain; charset=us-ascii

Status: R

hello world

//输入重定向,来自于文件

[root@localhost ~]# mail -s "test0" oldboy </etc/hosts

案例2:

[root@localhost ~]# grep root </etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

案例3:

[root@localhost ~]# dd if=/dev/zero of=file1.txt bs=1M count=20

记录了20+0 的读入

记录了20+0 的写出

20971520字节(21 MB)已复制,0.0262077 秒,800 MB/秒

[root@localhost ~]# ll -lh file1.txt

-rw-r--r-- 1 root root 20M 12月 23 21:33 file1.txt

[root@localhost ~]# dd if=/dev/sda of=mbr.bak  count=1

记录了1+0 的读入

记录了1+0 的写出

512字节(512 B)已复制,0.000315237 秒,1.6 MB/秒

[root@localhost ~]# ll -lh mbr.bak

-rw-r--r-- 1 root root 512 12月 23 21:35 mbr.bak

[root@localhost ~]# dd </dev/zero >file2.txt bs=1M count=20

记录了20+0 的读入

记录了20+0 的写出

20971520字节(21 MB)已复制,0.0467819 秒,448 MB/秒

[root@localhost ~]# ll -lh file2.txt

-rw-r--r-- 1 root root 20M 12月 23 21:39 file2.txt

案例4:

//mysql 表结构导入

mysql -uroot -p123 <bbs.sql

案例5:利用重定向建立多行的文件

[root@localhost ~]# cat >a.txt

asdsada

asdas

d

asd

案例6:利用重定向建立多行的文件

[root@localhost ~]# cat >c.txt <<EOF

> ASDAS

> ASDASD

> ASDAS

> EOF

cat >> /etc/ntf.conf <<EOF

>> /etc/ntf.conf cat <<EOF

总结:

1.进程管理

针对信号来管理进程

-1 HUP平滑重启

-9 强制

-15 默认,终止

kill pid

killall pname

pkill [ -u ] [-t]

2.作业掉度(前台后台)

jobs 查看后台作业

ctrl +z 把前台的作业暂停放入后台

bg 后台调度

fg 前台调度

课后作业:screen的使用

3.重定向输入输出

标准输入(STDIN,文件描述符为0):通常对应终端的键盘,也可以从其他文件或命令或者文件内容中输入

标准输出(STDOUT,文件描述符为1):默认输出到屏幕。

标准输出(STDERROR,文件描述符为2):默认输出到屏幕。

重定向输出:

> >> 2> 2>> &> 2>&1

将标准输出(显示器)改为文件输出

重定向输入

<

将标准输入(键盘)改为文件输出

linux重定向与管道符(一)的更多相关文章

  1. Linux学习之管道符、重定向、通配符、转义符、环境变量

    Linux学习之管道符.重定向.通配符.转义符.环境变量 1. 输入输出重定向 输入重定向是指把文件导入命令中. 输出重定向是指把原本要输出到屏幕的数据信息写入指定文件中. a 标准输入重定向(STD ...

  2. linux入门系列7--管道符、重定向、环境变量

    前面文章我们学习了linux基础命令,如果将不同命令组合使用则可以成倍提高工作效率.本文将学习重定向.管道符.通配符.转义符.以及重要的环境变量相关知识,为后面的shell编程打下基础. 一.IO重定 ...

  3. Linux就该这么学:重定向,管道符,通配符,转义符,环境变量

    第三章:重定向,管道符,环境变量 3.1 输入输出重定向 定义:输入重定向是指将文件导入命令中,输出重定向是指将原本显示到屏幕的信息输出问文件.相较于输入重定向,输出重定向使用的更多,下面重点介绍输出 ...

  4. 【转】Linux重定向操作符

    Linux重定向操作符 功能描述 > 将命令输出写入文件或设备,而不是命令提示符或句柄,清空原有文件然后写入 < 从文件而不是从键盘或句柄读入命令输入 >> 将命令输出添加到文 ...

  5. Linux重定向相关(转载帖,供自己cookbook)

    Linux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作.  Linux默 ...

  6. Linux重定向命令

    linux重定向命令应用及语法  [复制链接]   发表于 2008-12-18 18:24 | 来自  51CTO网页 [只看他] 楼主     1. 标准输入的控制语法:命令 文件将命令的执行结果 ...

  7. Linux重定向及nohup不输出的方法

    转载自:http://blog.csdn.net/qinglu000/article/details/18963031   先说一下linux重定向: 0.1和2分别表示标准输入.标准输出和标准错误信 ...

  8. 使用Linux重定向解决nohup.out无写权限问题

    ■场景 执行nohup命令的时候,经常会出现下面这种没有写入权限的错误. nohup: ignoring input and appending output to `nohup.out'nohup: ...

  9. Linux nohup 关闭终端的时候,程序依然能在后台运行( linux重定向及nohup不输出的方法)

    先说一下linux重定向: 0.1和2分别表示标准输入.标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出.在一般使用时,默认的是标准输出,既1.当我们需要特殊用途时,可以使用其他标号 ...

随机推荐

  1. 使用java service wrapper将java程序注册为window服务

    1.下载java service wrapper 下载地址:http://wrapper.tanukisoftware.com/doc/english/download.jsp 针对自己的需求下载相应 ...

  2. CodeForces - 131C The World is a Theatre(组合数)

    题意:已知有n个男生,m个女生.现在要选t个人,要求有至少4个男生,至少1个女生,求有多少种选法. 分析: 1.展开,将分子中的m!与分母中n!相约,即可推出函数C. #pragma comment( ...

  3. zabbix监控一个机器上的多个java进程的jvm

    一.监控安装部署 1.1 JVM端口配置 (/bqhexin/tomcat/bin/catalina.sh)在安装的tomcat路径,找到catalina.sh文件. vim编辑并添加: catali ...

  4. kube-apiserver常用配置项

    KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"                                        ...

  5. 刷题32. Longest Valid Parentheses

    一.题目说明 题目是32. Longest Valid Parentheses,求最大匹配的括号长度.题目的难度是Hard 二.我的做题方法 简单理解了一下,用栈就可以实现.实际上是我考虑简单了,经过 ...

  6. delphi 单例模式

    unit Singleton; (* 单例模式适用于辅助类, 一般伴随于单元的生命周期 *) interface uses SysUtils; type TSingleton = class publ ...

  7. textField 基本属性

    _textField.frame = CGRectMake(0, 0, 200, 50); _textField.delegate = self; _textField.text = str; [_t ...

  8. Java线程——线程之间的数据共享

      在 Java 传统线程机制中的共享数据方式,大致可以简单分两种情况: ➢ 多个线程行为一致,共同操作一个数据源.也就是每个线程执行的代码相同,可以使用同一个 Runnable 对象,这个 Runn ...

  9. 吴裕雄--天生自然 JAVASCRIPT开发学习:测试 jQuery

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. Python—使用列表构造队列数据结构

    队列的概念 只允许在一端插入数据操作,在另一端进行删除数据操作的特殊线性表:进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列):队列具有先进先出(FIFO)的特性. # _*_ ...