【Linux指北】Linux的重定向与管道

 一、了解Linux目录配置标准FHS

FHS本质:是一套规定Linux目录结构,软件建议安装位置的标准。

(使用Linux来开发产品或者发布软件的公司、个人太多,如果每家公司或者个人都按照自己的意愿来配置文件或者软件的存放位置,这无疑是一场灾难 ! )

# 进入根目录
[root@localhost home]# cd /
# 下载tree命令:以树状图查看目录结构
[root@localhost ~]# yum install -y tree# 查看目录树:
# tree -d -L 1 用于以树状图的形式显示指定目录下的内容。
# 其中,-d 选项表示只显示目录名称,而不显示目录内容;-L 1选项表示只显示第一层目录。
[root@localhost /]# tree -d -L 1.
├── bin -> usr/bin #可执行文件目录,linux自带命令在这里
├── boot #开机会使用到的文件,包括Linux核心文件以及开机菜单与开机所需配置文件等等。
├── dev #设备目录
├── etc #配置文件几乎都放置在这个目录内,例如人员的帐号密码档、 各种服务的启始档等等。
├── home #家目录,系统默认的使用者主文件夹,用户的个人文件都可放在这里
├── lib -> usr/lib #放置在开机时会用到的函数库,以及在/bin或/sbin下面的指令会调用的函数库
├── lib64 -> usr/lib64 #与lib类似
├── media #放置可移除的设备,包括软盘、光盘、DVD等等设备都暂时挂载于此。
├── mnt #设备临时挂载目录
├── opt #第三方协力软件放置的目录
├── proc #是一个虚拟文件系统,放置内存中的数据,不占用硬盘空间
├── root #系统管理员的主文件夹
├── run #放置系统开机后所产生的各项信息
├── sbin -> usr/sbin #里面包括了开机、修复、还原系统所需要的指令,root用户使用
├── srv #service是一些网络服务启动之后,这些服务所需要取用的数据目录。
├── sys #与proc类似
├── tmp #temp,让一般使用者或者是正在执行的程序暂时放置文件的地方
├── usr #unix software resource:与软件安装/执行有关
└── var #variable,与系统运行过程有关,主要为变动性较大的数据
19 directories
————————————————

linux目录结构详细说明:linux目录结构详细说明 


二、Linux数据重定向的理解与操作

2.1基本背景

基本大部分计算机,要与人交互,都要默认打开三个设备(文件)

  • 标准输入,stdin,代码是0
  • 标准错误,stdout,代码是1
  • 标准错误输出,stderr,代码是2

为什么?Linux一切皆文件,交互需求,输入输出信息分类。除了上面的三个标准设备(文件), 我们可能经常有从文件读取数据,或者将数据写入文件的场景。

2.2重定向的理解

输出/追加重定向:本来应该显示到显示器(通常)文件的内容,写入到文件当中。
输入重定向:或者本来应该从显示器(通常)文件读取数据,转化成从指定文件读取数据

# 当前只有三个文件
[root@localhost Practice]# ls
test2.txt  test3.txt  test.txt
# 本来应该输出在控制台输出到了文件中
[root@localhost Practice]# echo 'Hello World' > test.txt
[root@localhost Practice]# cat test.txt
Hello World
# 将'I am xx '输入到test.txt文件中,我们发现原来的内容被覆盖
[root@localhost Practice]# echo  'I am xx ' > test.txt
[root@localhost Practice]# cat test.txt
I am xx 
# 追加重定向:>>
#将指定内容追加到文件内容的末尾[root@localhost Practice]# echo 'Hello World' >> test.txt
[root@localhost Practice]# cat test.txt
I am xx 
Hello World
# 输入重定向:cat本来是查看文件内容
# 现在表示向test.txt中写数据
[root@localhost Practice]# cat > test.txt
nihao
#输入我们要写入的数据
#查看test.txt文件中的内容,发现之前的内容被nihao覆盖了
[root@localhost Practice]# cat test.txt
nihao
# 查看test2.txt文件的内容
[root@localhost Practice]# cat test2.txt
Hello Linux
# 理解:将test2.txt文件的内容写入test.txt文件
[root@localhost Practice]# cat < test2.txt > test.txt
[root@localhost Practice]# cat test.txt
Hello Linux

2.3Linux管道命令的理解与操作

命令是可以产生数据的,如果我们还要多输出数据进行加工,甚至想多次加工,就需要使用管道

[whb@VM-0-3-centos ~]$ last #显示正在或者最近登录linux的用户信息
whb pts/5 123.139.120.197 Tue Mar 2 16:24 still logged in
wudu pts/4 222.91.65.7 Tue Mar 2 15:34 still logged in
wudu pts/3 222.91.65.7 Tue Mar 2 15:34 still logged in
whb pts/2 123.139.120.197 Tue Mar 2 15:21 still logged in
root pts/1 222.91.65.7 Tue Mar 2 15:03 still logged in
whb pts/0 123.139.120.197 Tue Mar 2 13:59 still logged in
wudu pts/2 222.91.65.7 Tue Mar 2 12:12 - 13:52 (01:39)
wudu pts/1 222.91.65.7 Tue Mar 2 12:12 - 13:52 (01:39)
root pts/0 222.91.65.7 Tue Mar 2 12:12 - 13:52 (01:39)
wudu pts/9 222.90.196.96 Mon Mar 1 14:48 - 01:38 (10:50)
wudu pts/6 222.90.196.96 Mon Mar 1 14:41 - 01:38 (10:57)
root pts/8 222.90.196.96 Mon Mar 1 14:19 - 01:39 (11:19)
wudu pts/7 222.90.196.96 Mon Mar 1 14:16 - 01:39 (11:22)
#如果我只想看到前5条信息呢?
[whb@VM-0-3-centos ~]$ last | head -5 
#其中'|'就是管道
#head是一个截取文本行的工具
whb pts/5 123.139.120.197 Tue Mar 2 16:24 still logged in
wudu pts/4 222.91.65.7 Tue Mar 2 15:34 still logged in
wudu pts/3 222.91.65.7 Tue Mar 2 15:34 still logged in
whb pts/2 123.139.120.197 Tue Mar 2 15:21 still logged in
root pts/1 222.91.65.7 Tue Mar 2 15:03 still logged in
...

可见,管道是可以级联多条命令的,每条命令的结果输出,都作为输入,导入下一条命令。有点像流水线.( | 前的内容作为输入,| 后的内容作为输出)

7b36af4dd8214e42ae695cc068f56626.png

三、Linux 环境变量与PATH

假设我们想用C写一个输出 ‘hello world’ 的程序

[whb@VM-0-3-centos test]$ cat test.c
#include <stdio.h>
int main()
{printf("hello world\n");return 0;
}
# 编译文件gcc -o
[whb@VM-0-3-centos test]$ gcc -o mycmd test.c
[whb@VM-0-3-centos test]$ ll
total 16
-rwxrwxr-x 1 whb whb 8400 Mar 2 16:46 mycmd
-rw-rw-r-- 1 whb whb 74 Mar 2 16:46 test.c
#等等,这个 './' 是什么东西?mycmd从构成上,也可以认为是一个命令
#像ls,就在/bin/ls or /usr/bin/ls, 为什么执行ls命令不需要带路径呢?(尽管也可以)
[whb@VM-0-3-centos test]$ ./mycmd
hello world

3.1环境变量PATH

是一个路径集,命令再被执行时,系统会在环境变量PATH中进行路径查找,如果找到,就停止查找,执行命令。

[whb@VM-0-3-centos test]$ echo $PATH #不同环境,平台可能内容会有不同
/usr/local/jdk8/bin:/usr/local/jdk8/jre/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sb
in:/home/whb/.local/bin:/home/whb/bin
$: 用来显示PATH环境变量的内容
#各个路径以 : 作为分隔符,每个区域代表一个搜索路径

这也就解释了,为何 ls 不需要带路径,因为 ls 所在的路径,本身就在PATH环境变量列表当中。

一条命令的执行过程:

1.找到

2.执行

当我们执行自己的命令时,需要加./,而系统命令不同,这是因为自己的命令系统找不到没有路径。在系统中,可执行程序的搜索路径保存在一个‘全局变量’PATH中(作用:给系统提供命令的搜索路径,是环境变量的一种)

查看'PATH的内容'--》相当于一个字符串:保存了多条路径,路径之间通过 :作为分隔符。采用从左向右依次进行程序搜索,找不到就搜索下一条路径,最终没有找到会报command not found的错误

# which 验证发现 ls 命令在系统的环境变量中存在
[whb@VM-0-3-centos test]$ which ls #which 显示指定命令所在路径
alias ls='ls --color=auto'
/usr/bin/ls

那么问题来了,我也想让我的’hello world‘程序执行的时候不带‘./’这样的路径, 怎么办呢?

#方法一
[whb@VM-0-3-centos test]$ mycmd
-bash: mycmd: command not found
#将自己的命令随便拷贝到环境变量的路径中
[whb@VM-0-3-centos test]$ sudo cp mycmd /usr/bin
[sudo] password for whb:
[whb@VM-0-3-centos test]$ ls /usr/bin/mycmd
/usr/bin/mycmd
[whb@VM-0-3-centos test]$ mycmd #但是千万不要这样干,因为会‘污染’指令集
hello world
#方法二
[whb@VM-0-3-centos test]$ echo $PATH
/usr/local/jdk8/bin:/usr/local/jdk8/jre/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbi
n:/home/whb/.local/bin:/home/whb/bin
[whb@VM-0-3-centos test]$ pwd #查看自己当前处于哪个目录
/home/whb/test
[whb@VM-0-3-centos test]$ export PATH=$PATH:/home/whb/test#导出新的环境变量,加上程序所在的路径
[whb@VM-0-3-centos test]$ echo $PATH
/usr/local/jdk8/bin:/usr/local/jdk8/jre/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbi
n:/home/whb/.local/bin:/home/whb/bin:/home/whb/test
[whb@VM-0-3-centos test]$ sudo rm /usr/bin/mycmd #删掉在/usr/bin路径下的可执行程序
[whb@VM-0-3-centos test]$ which mycmd #mycmd已经能通过环境变量被找到
~/test/mycmd
[whb@VM-0-3-centos test]$ mycmd #可以不带路径
hello world

#了解一下即可
[whb@VM-0-3-centos test]$ env #显示当前用户环境变量
XDG_SESSION_ID=3288
HOSTNAME=VM-0-3-centos
TERM=xterm
SHELL=/bin/bash
HISTSIZE=3000
SSH_CLIENT=123.139.120.197 21378 22
OLDPWD=/home/whb
SSH_TTY=/dev/pts/6
JRE_HOME=/usr/local/jdk8/jre
USER=whb
LD_LIBRARY_PATH=:/home/whb/.VimForCpp/vim/bundle/YCM.so/el7.x86_64
CLASS_PATH=.:/usr/local/jdk8/lib
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or
=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.ta
r=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:
*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:
*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01
;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz
=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:
*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=0
1;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*
.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01
;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fl
i=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.
emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;3
6:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=
01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/whb
PATH=/usr/local/jdk8/bin:/usr/local/jdk8/jre/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/us
r/sbin:/home/whb/.local/bin:/home/whb/bin:/home/whb/test
PWD=/home/whb/test
JAVA_HOME=/usr/local/jdk8
LANG=en_US.utf8
SHLVL=1
HOME=/home/whb
LOGNAME=whb
SSH_CONNECTION=123.139.120.197 21378 172.17.0.3 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
PROMPT_COMMAND=history -a; printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}"
"${PWD/#$HOME/~}"
XDG_RUNTIME_DIR=/run/user/1005
HISTTIMEFORMAT=%F %T
_=/usr/bin/env

系统本身会提供某种全局查找属性,帮我们找到特定的模块/程序

其实,编译器内部也有类似的功能,想想,为何我们#include<头文件> ,并没有指明头文件在哪里,但是编译器也能帮我们找到并展开,包括我们也并没有指明我们的程序依赖哪些第三方库,编译器也能找到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32835.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt6.8.2中JavaScript调用WebAssembly的js文件<1>

前段时间已经学习了如何在QtAssembly中编译FFmpeg资源了&#xff0c;接下来需要使用Html来调用QtCreator中WebAssembly套件写的功能&#xff0c;逐步实现javascrpt与c复杂功能的视线。 接下来我先为大家介绍一个非常简单的加法调用吧&#xff01; 功能讲解 开发环境&#xf…

3.13-进程

进程 进程和程序 程序&#xff1a;编译好的二进制文件&#xff0c;不占用系统资源&#xff08;内存&#xff09;。进程&#xff1a;活跃的程序&#xff0c;不消耗系统图资源&#xff08;内存&#xff09;。 MMU PCB 进程控制块 本质&#xff1a;结构体&#xff1a;struct …

在 CentOS 7 上安装 PHP 7.3

在 CentOS 7 上安装 PHP 7.3 可以按照以下步骤进行操作&#xff1a; 1. 安装必要的依赖和 EPEL 仓库 EPEL&#xff08;Extra Packages for Enterprise Linux&#xff09;是为企业级 Linux 提供额外软件包的仓库&#xff0c;yum-utils 用于管理 yum 仓库。 sudo yum install -…

DeepSeek模型本地化部署方案及Python实现

DeepSeek实在是太火了&#xff0c;虽然经过扩容和调整&#xff0c;但反应依旧不稳定&#xff0c;甚至小圆圈转半天最后却提示“服务器繁忙&#xff0c;请稍后再试。” 故此&#xff0c;本文通过讲解在本地部署 DeepSeek并配合python代码实现&#xff0c;让你零成本搭建自己的AI…

C++从入门到入土(七)——多态

目录 前言 多态的概念 多态的定义 虚函数的介绍 虚函数的重写/覆盖 析构函数的重写 override和final关键字 纯虚函数和抽象类 重写/重载/隐藏总结 多态的原理 小结 前言 C一共有三个特性&#xff0c;封装、继承和多态&#xff0c;在前面的文章中&#xff0c;我们分别…

浅谈时钟启动和Systemlnit函数

时钟是STM32的关键&#xff0c;是整个系统的心脏&#xff0c;时钟如何启动&#xff0c;时钟源如何选择&#xff0c;各个参数如何设置&#xff0c;我们从源码来简单分析一下时钟的启动函数Systemlnit&#xff08;&#xff09;。 Systemlnit函数简介 我们先来看一下源程序的注释…

【数据结构】6栈

0 章节 3&#xff0e;1到3&#xff0e;3小节。 认知与理解栈结构&#xff1b; 列举栈的操作特点。 理解并列举栈的应用案例。 重点 栈的特点与实现&#xff1b; 难点 栈的灵活实现与应用 作业或思考题 完成学习测试&#xff12;&#xff0c;&#xff1f; 内容达成以下标准(考核…

HOT100——链表篇Leetcode160. 相交链表

文章目录 题目&#xff1a;Leetcode160. 相交链表原题链接思路代码 题目&#xff1a;Leetcode160. 相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表…

江科大51单片机笔记【16】AD/DA转换(下)

写在前言 此为博主自学江科大51单片机&#xff08;B站&#xff09;的笔记&#xff0c;方便后续重温知识 在后面的章节中&#xff0c;为了防止篇幅过长和易于查找&#xff0c;我把一个小节分成两部分来发&#xff0c;上章节主要是关于本节课的硬件介绍、电路图、原理图等理论知识…

【CF】Day5——Codeforces Round 921 (Div. 2) BC

B. A Balanced Problemset? 题目&#xff1a; 思路&#xff1a; 这道题要我们分成n个子问题&#xff0c;我们假设这几个子问题分别是a1,a2,a3,...an&#xff0c; 那么就是让我们求 gcd(a1,a2,a3,....,an)&#xff0c;我们假设这个值是d 那么就有 d | a1&#xff0c;d | a2…

Mininet 自定义拓扑类型详解

Mininet 通过 --topo 参数支持多种自定义网络拓扑结构&#xff0c;适用于不同场景的网络模拟需求。以下是所有内置拓扑类型及其参数说明&#xff1a; 一、基础拓扑类型 拓扑类型参数格式说明示例命令singlesingle,<n>单一交换机连接所有主机&#xff08;默认 2 台主机&a…

图论part3|101.孤岛的总面积、沉没孤岛、417. 太平洋大西洋水流问题

101. 孤岛的总面积 &#x1f517;&#xff1a;101. 孤岛的总面积思路&#xff1a;和昨天的岛的区别是&#xff1a;是否有挨着边的岛屿 所以可以先遍历四条边挨着的岛屿&#xff0c;把他们标记为非孤岛再计算其他岛屿当中的最大面积 代码&#xff1a;&#xff08;深度搜索&…

第十一届蓝桥杯单片机国赛

什么&#xff1f;4T模拟赛和省赛做起来轻轻松松&#xff1f;不妨来挑战一下第十一届国赛&#xff0c;这一届的国赛居然没考超声波、串口通信&#xff01;只要你正确地理解了题目的意思&#xff0c;规避出题人挖的坑&#xff0c;拿个国一轻轻松松。 附件&#xff1a;第十一届蓝桥…

【Unity6打包Android】游戏启动的隐私政策弹窗(报错处理)

Unity版本&#xff1a;Unity6000.0.24 增加弹窗步骤 1. 自定义AndroidManifest 1.1 在Player Setting > Publishing Settings > Build下勾选Custom Main Manifest&#xff0c;在Assets/Plugins/Android路径下生成AndroidManifest.xml文件 1.2 修改AndroidManifest.xml…

记录一个SQL自动执行的html页面

在实际工作场景中&#xff0c;需要运用到大量SQL语句更新业务逻辑&#xff0c;对程序员本身&#xff0c;写好的sql语句执行没有多大问题&#xff08;图1&#xff09;&#xff0c;但是对于普通用户来说还是有操作难度的。因此我们需要构建一个HTML页面&#xff08;图2&#xff0…

mac安装mysql之后报错zsh: command not found: mysql !

在Mac上安装MySQL后&#xff0c;如果终端中找不到mysql命令&#xff0c;通常是 因为MySQL的命令行工具&#xff08;如mysql客户端&#xff09;没有被正确地添加到你的环境变量中。 检查 MySQL 是否已安装 ps -ef|grep mysql查看到路径在 /usr/local/mysql/bin 查看 .bash_pro…

socket编程与TCP协议

如果你想和远方的朋友通电话&#xff0c;但是&#xff0c;没有办法直接把自己的声音放在电线上变成电流信号&#xff0c;你需要使用电话机拿起听筒拨号&#xff0c;而这个电话就是Socket&#xff0c;它让你简单方便地完成电流通话&#xff0c;从我们编程的角度来看&#xff0c;…

css基本功

为什么 ::first-letter 是伪元素&#xff1f; ::first-letter 的作用是选择并样式化元素的第一个字母&#xff0c;它创建了一个虚拟的元素来包裹这个字母&#xff0c;因此属于伪元素。 grid布局 案例一 <!DOCTYPE html> <html lang"zh-CN"><head&…

环境配置 | 5分钟极简Git入门:从零上手版本控制

你是否刚接触Git&#xff1f;别担心&#xff01;这篇指南将用最简单的步骤带你掌握Git核心操作&#xff0c;快速开启版本控制之旅&#xff01;✨ 1.git在win10上的下载安装 1.1.下载git 打开官方网站 Git - Downloadshttps://git-scm.com/downloads ​ ​​ 1.2.git安装 …

软件工程概述、软件过程模型、逆向工程(高软45)

系列文章目录 软件工程概述、软件过程模型、逆向工程。 文章目录 系列文章目录前言一、软件工程概述二、能力成熟度模型1.能力成熟度模型CMM2.能力成熟度模型集成CMMI 三、软件过程模型1.瀑布模型SDLC2.原型化模型3.螺旋模型4.增量模型5.喷泉模型6.敏捷模型7.统一过程模型RUP 四…