Linux重定向笔记

简介: Linux重定向笔记

前言

这部分知识几度学习几度忘却,还是需要总结梳理才能真正领会。

后台运行的脚本

重定向使用比较多的还是在我们去后台运行一个程序说起,比如这下面的操作

apps@PC-zhuxuemin:~/xuemin$ nohup ./callsystem >/dev/null  2>& 1 &
[1] 3923

后台执行的地方我都记得住,主要是很多次2>& 1学会又忘记,这次围绕这个知识点进行总

箭头指向

linux一大哲学便是一切皆文件,数据输入输出则被定义为流,我们的程序就像自来水工厂一样对数据进行加工,处理好的水则对外输出。< 则是代表读取的数据源,> 则是输出目的地。linux中每个程序都有标准的输入和输出流,标准输入则是我们的键盘,标准输出就是我们的控制台。

ls输出到控制台

cat可以从文件读取,输出到控制台

默认状态下我们也没有去深究,但是这个状态其实是可以被我们去改变的

比如:

ll >ls.log
read  < ls.log  a
echo $a

read 则从一个文件中读取数据,然后结果给变量a

文件描述符

linux文件中描述符file description其实是一个结构体,是对文件的引用,说白了其实就是定义一个变量,然后我们访问变量可以读到内容。

使用exec可以绑定一个文件到 文件描述符中,比如还是刚才的文件:

echo "lslog里面内容" >ls.log
exec  5< ls.log
cat <& 5

我们这样就绑定了5变量,箭头<还是读取的意思,所以原来我们需要读取ls.log的写法就可以变成使用变量去读取了

看到效果其实是一样的,这里有个相当于使用变量的语法 <& 代表引用文件描述符,后面便是编号,其实反过来理解,如果直接去的&则会把5当成普通文件去读取,不就产生歧义了嘛!

lsof查看文件描述符

lsof是列出打开文件(lists openfiles)的意思,后面接进程号即可,另外$$在linux可以拿到当前bash的进程号,我们可以组合使用去查看我们定义的文件描述符:

lsof -p $$

我们可以看到红色部分有个5,其实那个就是我们变量名字啦,另外顺带看到下面有我们的0 1 2其实就是默认给我们带的,这也是为啥我们可以去使用 >& 2 类似这种操作的原因了,具体是表示啥呢,其实都有直接规定的,我们通过/dev下面可以看到绑定的情况:

ls -l /dev

还是一切皆文件,proc下面是linux进程信息的映射,我们切可以看到2 0 1指向的变量,分别就是标准错误输出,标准输入和标准输出,就是我们的控制台和键盘。

不仅如此,其实我们要建立外部链接也是可以的

exec 7<> /dev/tcp/www.baidu.com/80

系统会显示TCP的连接类型了

重定向的变量覆盖问题

回到最开始的脚本

nohup ./callsystem >/dev/null  2>& 1 &

其实这里还有个坑,如果我们写成

nohup ./callsystem  2>& 1 1>/dev/null &

这样子是有问题的,这个从程序理解可以比较方便,2>&1 其实是会把2赋值给1指向的实际内容,已经是控制台了,那么后面的覆盖1>/dev/null不会再对2起作用了

目录
相关文章
|
1月前
|
Ubuntu Linux Python
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
在Linux系统中,使用Tkinter库时可能会遇到中文显示乱码的问题,这通常是由于字体支持问题导致的,可以通过更换支持中文的字体来解决。
119 0
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
|
3月前
|
Linux
Linux源码阅读笔记10-进程NICE案例分析2
Linux源码阅读笔记10-进程NICE案例分析2
|
3月前
|
Linux
Linux源码阅读笔记09-进程NICE案例分析1
Linux源码阅读笔记09-进程NICE案例分析1
|
1月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
82 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
3月前
|
Unix Linux 开发工具
linux笔记 diff及patch的制作与使用
这篇文章是关于Linux系统中使用`diff`命令生成补丁文件以及使用`patch`命令应用这些补丁的详细教程和实战案例。
86 2
linux笔记 diff及patch的制作与使用
|
3月前
|
安全 Linux 开发者
Linux笔记之ldd命令详解
`ldd`命令是Linux环境下一个非常实用的工具,用于显示一个程序运行时所需的共享库依赖。它帮助开发者和系统管理员快速诊断程序运行问题,特别是在处理"找不到库文件"或者"错误的库文件版本"等错误时。然而,出于安全的考虑,对于不信任的可执行文件,应该慎用 `ldd`命令,可以考虑使用其他工具如 `objdump`。总的来说,懂得如何妥善且安全地使用 `ldd`,对于维护一个稳定和高效的Linux系统来说,是非常重要的。
70 9
|
3月前
|
Linux
Linux源码阅读笔记13-进程通信组件中
Linux源码阅读笔记13-进程通信组件中
|
3月前
|
消息中间件 安全 Java
Linux源码阅读笔记13-进程通信组件上
Linux源码阅读笔记13-进程通信组件上
|
3月前
|
Linux 开发者
Linux源码阅读笔记18-插入模型及删除模块操作
Linux源码阅读笔记18-插入模型及删除模块操作
|
3月前
|
Linux
Linux源码阅读笔记12-RCU案例分析
Linux源码阅读笔记12-RCU案例分析