首页 > 系统相关 >Linux 重定向

Linux 重定向

时间:2024-07-16 09:26:07浏览次数:19  
标签:文件 重定向 输出 标准 描述符 Linux 输入

前言

        在LINUX系统中,往往一个命令只实现简单的操作,例如ls、cat、head、tail等等。复杂的操作,一般情况下是简单命令的作用。这得益于Linux的重定向与管道功能,能够将一些列简单的指令组合来完成复杂的操作。另外,重定向与管道能够应用的一个基础是LINUX中的处理绝大数都是文本形式,这相当于命令的输入输出参数有了统一的形式。

重定向

        在计算机中,一般情况下的默认输入为键盘,输出为显示屏。重定向是一种将标准输入(stdin)和标准输出(stdout)从它们的默认设备转移到文件或其他设备的技术。即重定向则允许用户能够指定特定的输入来源,而非键盘这一个来源。

前置知识

文件描述符

        在LINUX中所有执行I/O操作的系统调用都是以文件描述符的形式进行,而文件描述符(fd,file discription)其实就是一个非负整数,用来指代打开的文件。一般情况下,一个进程可能打开的文件不止一个。在整个系统中会存在大量被打开的文件,同时还会对文件进行操作(这会涉及到文件内容偏移),操作系统对文件操作会进行管理和记录。在实际的LINUX系统中操作系统通过数据结构对文件数据进行组织和管理。具体的组织与管理如下:

LINUX 进程管理组织文件的数据结构

        在上图中,task_struct结构体为进程控制块PCB(Process Control Block)或进程描述符PD用来控制与管理进程。每一个进程都有一个file的指针数组(文件描述符表),这个数组的表项保存着一个指向打开文件的指针。所有,进程就可以通过数组的下标索引找到对应的文件,而这个下标索引就是文件描述符。

标准输入、标准输出、标准错误输出

        Linux 系统中,标准输入输出是由系统内核管理的,它们通过文件描述符提供给应用程序。文件描述符是一个整数,用以标识一个已打开的文件。在C语言中,scanfprintf函数用于标准输入和标准输出的输入输出操作。而在Linux中,STDIN_FILENOSTDOUT_FILENO是用于表示标准输入和标准输出的文件描述符。

文件描述符用途POSIX名称stdio流
0标准输入 STDIN _ FILENO stdin
1标准输出 STDOUT _ FILENO stdout
2标准错误 STDERR _ FILENO stderr

实现原理

fd分配原则
  • 文件描述符0、1、2被系统固定分配给标准输入、标准输出以及标准错误。其他的文件的分配需要从3开始。
  • 使用当前没有被使用的fd中最小的一个下标给打开的文件。
重定向的本质

在操作系统内部更改文件操作符fd的内容指向

输出重定向
输出重定向

输入重定向
重定向命令
命令描述示例
>输出重定向:命令的标准输(stdout)重定向到文件中,如果文件已存在,它会被覆盖。如果文件不存在,它会被创建。echo "Hello World" > output.txt
>>输出追加:将命令的标准输出追加到文件的末尾。如果文件不存在,它会被创建。echo "Hello Again" >> output.txt
2>错误重定向:将标准错误重定向到文件中。如果文件已存在,它会被覆盖。ls non_existing_file 2> error.log
2>>错误追加重定向:将标准错误追加到文件中。ls non_existing_file 2>> error.log
&>合并输出和错误:将标准输出和标准错误都重定向到同一个文件中。如果文件已存在,它会被覆盖。ls non_existing_file &> output_and_error.log
&>>合并输出和错误追加:将标准输出和标准错误都追加到同一个文件中ls non_existing_file 2>> error.log
<输入重定向:将文件内容作为命令的标准输入grep error < log.txt

标签:文件,重定向,输出,标准,描述符,Linux,输入
From: https://blog.csdn.net/weixin_42105599/article/details/140423029

相关文章

  • Linux系统搭建轻量级个人博客VanBlog并一键发布公网远程访问
    文章目录前言1.Linux本地部署2.VanBlog简单使用3.安装内网穿透4.创建公网地址5.创建固定公网地址前言今天和大家分享如何在LinuxUbuntu系统搭建一款轻量级个人博客VanBlog,并结合cpolar内网穿透软件生成公网地址,轻松实现随时随地远程访问本地部署的站点。无需......
  • linux高级编程(sqlite数据库调用)
    数据库1、分类:大型  中型        小型      ORACLE MYSQL/MSSQL SQLITE DBIIpowdb      关系型数据库    2、名词:      DB      数据库selectupdatedatabase      DBMS   数据库管理......
  • 内存管理-19-vmlinux.lds.S分析
    基于msm-5.4一、简介链接器主要任务是将符号引用解析到符号定义上,将多个目标文件(.o)和库文件合并成为一个可执行文件或者动态链接库,生成符号表,并对程序代码做最后的检查和优化。这个链接脚本在Linux内核里就是vmlinux.lds.S文件。vmlinux.lds.S编译后会在out/target目录......
  • Linux查看某个进程的环境变量,以及重定向后的输出
    1.查看环境变量根据进程pid看,以121927号进程为例:cat/proc/121927/environ|tr'\0''\n'每个环境变量都以'\0'结束,直接cat会不方便查看,将'\0'替换为'\n'可以方便查看。注意,tr后必须加单引号,不然参数会被shell转义为0和n。或者可以:cat/proc/121927/environ|tr\\0\\n......
  • Linux的文件查找吉计划任务练习题
    #练习1 使用ls查看/etc/目录下的所有文件信息[root@gym~]#ls/etc/#练习2 使用ls查看/etc/⽬录下名包含“a”字⺟的⽂件或者⽬录信息[root@gym~]#ls/etc/|grep'a'#练习3 使用ls查看/etc/目录下以“.conf”结尾的文件信息[root@gym~]#ls/etc/*.conf#......
  • Linux——添加默认路由(能ping通本网段,但是ping不通其他网段)
    2024/07/151.问题描述2.问题处理3.其他问题1.问题描述昨天服务器突然断电,今天重启后,网络出了些问题,具体情况如下:能ping通本机IPping不通网关ping不通本网段其他IP地址ping不通其他网段地址2.问题处理vi/etc/sysconfig/network-scripts/ifcfg-ens32检查了网卡配置文......
  • Structure of Linux Kernel Device Driver(Part I)
    StructureofLinuxKernelDeviceDriverref.https://www.youtube.com/watch?v=XoYkHUnmpQo&list=LL&index=1&t=272sDeviceDriversDef.:设备驱动(DeviceDrivers),实际上就是硬件设备对应的抽象,用户能够通过这样的一个抽象与对应的硬件进行交互设备驱动与固件的区别:设备驱......
  • 【Linux网络编程-6】IO复用
    select模型//selectServer.cpp#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<arpa/inet.h>#include<sys/socket.h>#include<errno.h>#include<sys/select.h>#include&......
  • Linux获取进程cpu使用情况
    相关:{%post_linkshell/'Linux获取线程CPU使用情况'%}CPU使用率pidstat(推荐)pidstat-p进程PID-H-u间隔秒数|awk'{if(NR>3){print$1,$8}}'-H:Displaytimestampinsecondssincetheepoch.-u:ReportCPUutilization.NR>3:第四行开始才是有效输出。awk......
  • ArchLinux微信
    flatpak原生微信。flatpakinstallcom.tencent.WeChatflatpakruncom.tencent.WeChat也可以从系统的启动器里启动。{%post_linkApp/'flatpak教程'%}deepin-wine-wechatyay-Sdeepin-wine-wechat我尝试的版本:3.9.0.28-3如果是KDE的话,大概会报这个错:/opt/apps/com......