zoukankan      html  css  js  c++  java
  • linux重定向与管道符(一)

    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

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

    重定向输入

    <

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

  • 相关阅读:
    Java学习小记 5
    Java学习小记 4
    Java学习小记 3
    Java学习小记 2
    Java学习小记 1
    ThreadLocal详解
    jvm之java类加载机制和类加载器(ClassLoader)的详解
    什么情况下JVM内存中的一个对象会被垃圾回收?
    java线程池的拒绝策略
    logback配置文件---logback.xml详解
  • 原文地址:https://www.cnblogs.com/xmtxh/p/12088848.html
Copyright © 2011-2022 走看看