LINUX——Bashshell资料(三)认识shell和各种变量

命令重导向  

基本上,这个子题是 bash 相当重要的观念,这里可得花点心思才行呦!

o 什么是『重导向, redirect ?』:简单的说,就是将你目前的所得资料转到其他地方去就是了!例如我们常用的,将目前的萤幕输出资料转到档案中去,就可以这么写:『ls -l / > test 』,那个大于的符号『 > 』就是将输出结果导向到 test 这个档案中的意思啰!这个时候: 

§ 如果你执行『 ls -l / 』而已的话,萤幕会将根目录的档案与目录都列出在萤幕上; 

§ 但是当使用 > 导向到 test 这个档案中时,则萤幕不会显示任何讯息,但是会将刚刚你执行的结果输出到 test 这个档案中。 

所以啰,你只要『 vi test 』一下,就会知道 test 这个档案中记录了刚刚我们执行的资料结果啰!不过,这里需要特别留意的是,当你使用 > 符号将资料由萤幕导向到档案中时,则: 

§ 该档案(就是 test )若不存在,系统会自动的将他建立起来,但是, 

§ 当这个档案存在的时候,那么系统就会先将这个档案内容清空,然后再将资料写入! 

§ 也就是若以 > 输出到一个既存档案中,呵呵,那个档案就会被覆盖掉啰! 

除了这个 > 的符号之外,在 bash 命令执行的过程中,主要有三种输出入的状况,分别是:

1. 标准输入;代码为 0 ;或称为 stdin ;使用的方式为 < 

2. 标准输出:代码为 1 ;或称为 stdout;使用的方式为 1> 

3. 错误输出:代码为 2 ;或称为 stderr;使用的方式为 2> 

注意了!那个 1> 与 2> 之间并没有空白字元!而相关的使用说明可以举例如下 

 

[test @test test]# ls -al > list.txt <==将显示的结果输出到 list.txt 档案中,若该档案以存在则予以取代! [test @test test]# ls -al >> list.txt <==将显示的结果累加到 list.txt 档案中,该档案为累加的,旧资料保留! [test @test test]# ls -al 1> list.txt 2> list.err <==将显示的资料,正确的输出到 list.txt 错误的资料输出到 list.err [test @test test]# ls -al 1> list.txt 2>&1 <==将显示的资料,不论正确或错误均输出到 list.txt 当中! [test @test test]# ls -al 1> list.txt 2> /dev/null<==将显示的资料,正确的输出到 list.txt 错误的资料则予以丢弃!注意!错误与正确档案输出到同一个档案中,则必须以上面的方法来写!不能写成其他格式!

这个观念相当的重要,尤其是在 /etc/crontab 当中执行的时候,如果我们已经知道错误的讯息为何,又不想要让错误的讯息一直填满 root 的信箱,就必须以 2> 搭配 /dev/null 这个垃圾桶黑洞装置,来将资料丢弃!这个相当的重要!

这里我们来说明一下命令重导向里面几个常用的符号与装置: 

o < :由 < 的右边读入参数档案; 

o > :将原本由萤幕输出的正确资料输出到 > 右边的 file ( 档案名称 ) 或 device ( 装置,如 printer )去; 

o >> :将原本由萤幕输出的正确资料输出到 >> 右边,与 > 不同的是,该档案将不会被覆盖,而新的资料将以『增加的方式』增加到该档案的最后面; 

o 2> :将原本应该由萤幕输出的错误资料输出到 2> 的右边去。 

o /dev/null :可以说成是黑洞装置! 

好了,对于『 > , >> 』这两个东西有一定的概念之后,我们来深入的谈一谈『命令输出重导向』的观念吧!如前所述,基本上, Linux 执行的结果中,可以约略的分成『正确输出』与『错误输出』两种方式。例如,当你以一般身份执行 find 这个指令时,例如执行『 find / -name testing 』时,由于你是一般身份,又有些资料夹是不允许一般身份者进入的,所以啰,当你使用 find 时,就会有错误讯息发生了!但同时如果有 testing 这个档案在你可以进入的资料夹当中,那么萤幕也会输出到给你看!因此,就具有正确的与错误的输出两种啰!(分别称为 Stdout 与 Stderror)例如下面为执行结果:里面的『 find: /home/root: Permission denied 』就告诉你该资料夹你没有权限进入,这就是错误的输出了,那么『 /home/test/tseting 』就是正确的输出了! 

 

[test @test test]# find / -name testing find: /home/test1: Permission denied <==这是错误的输出 find: /home/root: Permission denied  <==这是错误的输出 find: /home/masda: Permission denied <==这是错误的输出 /home/test/testing<==这是『正确』的输出 [test @test test]# 

好了,那么假如我们想要将资料输出到 list 这个档案中呢?执行『 find / -name testing > list 』会有什么结果?呵呵,你会发现 list 里面存了刚刚那个『正确』的输出资料,至于萤幕上还是会有错误的讯息出现呢!伤脑筋!如果想要将正确的与错误的资料分别存入不同的档案中需要怎么做?!呵呵!其实在资料的重导向方面,正确的写法应该是『 1> 』与『 2> 』才对!但是如果只有 > 则预设是以 1> 来进行资料的!那个 1> 是输出正确资料, 2> 则是错误资料输出项目。也就是说: 

· 1> :是将正确的资料输出到指定的地方去 

· 2> :是将错误的资料输出到指定的地方去 

好了,那么上面的例子中,我们如何将资料输出到不同的地方去呢?可以这么写: 

 

[test @test test]# find / -name testing 1> list_right 2> list_error

这样一来,刚刚执行的结果中,有 Permission 的那几行错误资讯都会跑到 list_error 这个档案中,至于正确的输出资料则会存到 list_right 这个档案中啰!这样可以了解了吗?如果有点混乱的话,去休息一下再来看看吧!!

再来,如果我只要正确的资料,错误的资讯我不要了呢?呵呵,这个时候 /dev/null 这个垃圾桶就很重要了!/dev/null 是什么呢?基本上,那就有点像是一个『黑洞』的垃圾桶功能!当你输入的任何东西导向到这个虚拟的垃圾桶装置时,『他就会凭空消失不见了~~』,这个东西有用的很!例如上面的例子中,我们可以这么做,来将错误的资讯丢掉! 

 

[test @test test]# find / -name testing 1> list_right 2> /dev/null

很神奇呦! error message 就会『不见了!』呵呵!真高兴!另外,如果我要将资料都写到同一个档案中呢?这个时候写法需要用到特殊写法,请注意底下的写法呦! 

 

[test @test test]# find / -name testing 1> list 2> list <==错误写法 [test @test tset]# find / -name testing 1> list 2>&1 <==正确写法

请特别留意这一点呢!同时写入同一个档案需要使用 2>&1 才对呦!

OK!了解了 >, 2>, >> 与 /dev/null 之后,那么那个 < 又是什么呀!?呵呵!以最简单的说法来说,那就是『将原本需要由键盘输入的资料,经由档案来读入』的意思,最明显的例子就是 mail 这个东西了!我们以 root 的身份来寄信给 root 好了,可以这样做: 

 

1. 完全由键盘输入资料: [root @test test]# mail -s "test" root <== -s 表示标题, root 为收件者 I am root! <==以下的资料都是由键盘输入的 That's OK .   <==要结束键盘的输入时,需要在一行的最前面加上 . 即可! CC. <==是否需要有密件副本?不需要的话,直接按下 Enter ! EOF <==表示送出的提示字元而已! 2. 由档案代替输入 [test @test tset]# mail -s "test" root < /root/.bashrc <==将 .bashrc 内容寄给 root !

很有趣吧! ^_^ 这样就可以将信寄出去啰!所以说,熟悉命令重导像的话,对您可是相当的有帮助的呦!

好了,那么为何要使用命令输出重导向呢?这个问题一定会困扰你一下下的,如果你从来都没有写过 script 的话!好了,我们来说一说吧!

o 当萤幕输出的资讯很重要,而且我们需要将他存下来的时候; 

o 背景执行中的程式,不希望他干扰萤幕正常的输出结果时; 

o 一些系统的例行命令(例如写在 /etc/crontab 中的档案)的执行结果,希望他可以存下来时; 

o 一些执行命令,我们已经知道他可能的错误讯息,所以想以『 2> /dev/null 』将他丢掉时; 

o 错误讯息与正确讯息需要分别输出时。 

当然还有很多很多的功能的,最简单的就是网友们常常问到的:『为何我的 root 都会收到系统 crontab 寄来的错误讯息呢』这个咚咚是常见的错误,而如果我们已经知道这个错误讯息是可以忽略的时候,嗯!『 2> errorfile 』这个功能就很重要了吧!了解了吗??

管线命令 ( pipe ) 

· 管线命令: 

就如同前面所说的, bash 命令执行的时候有输出的资料会出现!那么如果这群资料必需要经过几道手续之后才能得到我们所想要的格式,应该如何来设定?这就牵涉到管线命令的问题了( pipe ),管线命令使用的是『 | 』这个界定符号!另外,管线命令与『连续下达命令』是不一样的呦!这点底下我们会再说明。底下我们先举一个例子来说明一下简单的管线命令。

假设我们要读取 last 这个指令中,那个 root 登入的『次数』应该怎么作?注意呦!我们只需要『次数』。那么我所进行的步骤是:

1. 执行 last ,将所有这个月的所有人登入资料取出来; 

2. 使用 grep 将上面的输出资料(stdout)当中的 root 撷取出来,其他的不要; 

3. 使用 wc 这个可以计算行数的指令将上一步的资料计算行数! 

由于 last 的输出是一行代表一次登入,所以只要计算几行就代表登入几次的意思,所以啰!经由上面三个步骤,将 last 资料逐步的筛选,就可以得到我们的资料了!整个命令可以写成如下: 

[test @test bin]# last [test @test bin]# last | grep root [test @test bin]# last | grep root | wc -l 

你可以分别执行『 last 』然后再逐步增加为『 last | grep root 』,最后到上面那一行,那么就马上可以清楚的知道为何会这么做啰!

底下我们来谈一谈一些基本的管线命令指令介绍: 

· cut 

语法: 

[root @test /root ]# cut -d "分隔字元" [-cf] fields 参数说明: -d :后面接的是用来分隔的字元,预设是『空白字元』 -c :后面接的是『第几个字元』 -f :后面接的是第几个区块? 范例: [root @test /root]# cat /etc/passwd | cut -d ":" -f 1 <==将 passwd 这个档案里面,每一行里头的 : 用来作为分隔号, 而列出第一个区块!也就是姓名所在啦! [root @test /root]# last | cut -d " " -f1 <==以空白字元为分隔,并列出第一个区间! [root @test /root]# last | cut -c1-20<==将 last 之后的资料,每一行的 1-20 个字元取出来!

· 说明: 

这个 cut 实在很好用!不过,说真的,除非你常常在分析 log 档案,否则使用到 cut 的机会并不多!好了! cut 主要的用途在于将『同一行里面的资料进行分解!』,最常使用在分析一些数据或文字资料的时候!这是因为有时候我们会以某些字元当作分割的参数,然后来将资料加以切割,以取得我们所需要的资料。我也很常使用这个功能呢!尤其是在分析 log 档案的时候,跟 awk 也是很常用的!

· sort 

语法: 

[root @test /root ]# sort [-t 分隔符号] [(+起始)(-结束)] [-nru] 参数说明: -t 分隔符号:使用分隔符号来隔开不同区间,预设是 tab +start -end:由第 start 区间排序到 end 区间 -n:使用『纯数字』排序(否则就会以文字型态来排序) -r :反向排序 -u :相同出现的一行,只列出一次! 范例: [root @test /root]# cat /etc/passwd | sort <==将列出来的个人帐号排序! [root @test /root]# cat /etc/passwd | sort -t: +2n <==将个人帐号中,以使用者 ID 来排序(以 : 来分隔,第三个为 ID ,但第一个代号为 0 之故) [root @test /root]# cat /etc/passwd | sort -t: +2nr  <==反相排序啰!

· 说明: 

sort 同样是很常用的指令呢!因为我们常常需要比较一些资讯啦!举个上面的第二个例子来说好了!今天假设你有很多的帐号,而且你想要知道最大的使用者 ID 目前到哪一号了!呵呵!使用 sort 一下子就可以知道答案咯!当然其使用还不止此啦!有空的话不妨玩一玩!

· wc 

语法: 

[root @test /root ]# wc [-lmw] 参数说明: -l  :多少行 -m  :多少字元 -w  :多少字? 范例: [root @test /root]# cat /etc/passwd | wc -l  <==这个档案里头有多少行? [root @test /root]# cat /etc/passwd | wc -w  <==这个档案里头有多少字!?

· 说明: 

wc 也可以当作指令?呵呵!这可不是上洗手间的 WC 呢!这是相当有用的计算档案内容的一个工具组喔!举个例子来说,当你要知道目前你的帐号档案中有多少个帐号时,就使用上面的 wc -l 啦!因为 /etc/passwd 里头一行代表一个使用者呀!所以知道行数就晓得有多少的帐号在里头了!而如果要计算一个档案里头有多少个字元时,呵呵!就使用 wc -w 这个参数吧!

o uniq 

语法: 

[root @test /root ]# uniq 参数说明: 范例: [root @test /root]# last | cut -d" " -f1 | sort | uniq

o 说明: 

这个指令用来将『重复的行删除掉只显示一个』,举个例子来说,你要知道这个月份登入你主机的使用者有谁,而不在乎他的登入次数,那么就使用上面的范例, (1)先将所有的资料列出;(2)再将人名独立出来;(3)经过排序;(4)只显示一个!由于这个指令是在将重复的东西减少,所以当然需要『配合排序过的档案』来处理啰!例如我们侦测 Nimda 病毒的时候会用到的这个小指令即是!基本上,这个小程式可以让大家很清楚的知道命令重导向与管线处理的用途啰!

o tee 

语法: 

[root @test /root ]# last | tee last.list | cut -d " " -f1 参数说明: 范例: [root @test /root]# last | tee last.list | cut -d " " -f1

o 说明: 

有没有发现在命令重导向的时候,如果我们要将资料送出到档案的时候,萤幕上就不会出现任何的资料!那么如果我们需要将资料同时显示在萤幕上跟档案中呢?呵呵!这个时候就需要 tee 这个指令啰!使用 last 可以查看到这个月份的登入资料,而使用了 tee 之后,会将资料同时传给下一个命令去执行,也会将资料写入 last.list 这个档案中!也是个好帮手!

o tr 

语法: 

[root @test /root ]# tr [-ds] SET1 参数说明: -d :删除 SET1 这个字串 -s :取代掉重复的字元! 范例: [root @test /root]# last | tr '[a-z]' '[A-Z]' <==将小写改成大写 [root @test /root]# cat /etc/passwd | tr -d : <==嘿嘿! : 这个符号在 /etc/passwd 中不见了! [root @test /root]# cat /home/test/dostxt | tr -d '\r' > dostxt-noM  <==将 DOS 档案的字尾符号 ^M 的符号去除!

o 说明: 

其实这个指令也可以写在『正规表示法』里头!因为他也是由正规表示法的方式来取代资料的!以上面的例子来说,使用 [] 可以设定一串字呢!也常常用来取代档案中的怪异符号!例如上面第三个例子当中,可以去除 DOS 档案留下来的 ^M 这个断行的符号!这东西相当的有用!相信处理 Linux & Windows 系统中的人们最麻烦的一件事就是这个事情啦!亦即是 DOS 底下会自动的在美行行尾加入 ^M 这个断行符号!这个时候我们可以使用这个 tr 来将 ^M 去除! ^M 可以使用 \r 来代替之!

o split 

语法: 

[root @test /root ]# split [-bl] 输入档案 输出档案前导字元 参数说明: -b :以档案 size 来分 -l :以行数来分 范例: [root @test /root]# split -l 5 /etc/passwd test  <==会产生 testaa, testab, testac... 等等的档案

o 说明: 

在 Windows 的情况下,你要将档案分割需要如何作?!伤脑筋吧!呵呵!在 Linux 底下就简单的多了!你要将档案分割的话,那么就使用 -b size 来将一个分割的档案限制其大小,如果是行数的话,那么就使用 -l line 来分割!好用的很!如此一来,你就可以轻易的将你的档案分割成 floppy 的大小,方便你 copy 啰!

管线命令在 bash 的连续的处理程序中是相当重要的!另外,在 log file 的分析当中也是相当重要的一环,所以请特别留意!好嘛!?

· 连续命令: 

咦!连续命令与管线命令有什么不一样?!基本上,连续命令可以想成是 shell script 写在 command mode (指令命令列模式)的一种方式!与刚刚的管线命令将输出资料持续的进行处理的方式是不相同的!因为『在管线命令中,每个指令所使用的资料都是相关的;但是在连续命令的情况下,每个指令的输出与输入都是独立的』。举例来说,我在指令列底下,要将 mount CD-ROM 的模组一起挂上来,可以这样写: 

[root @tset /root]# modprobe cdrom ; modprobe ide-cd

· 两个指令之间以『 ; 』符号来作为界定!则相当于输入了 modprobe cdrom ,并且执行完毕之后,再执行 modprobe ide-cd 的意思!两的命令之间并没有绝对的相关性!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在现有省、市港口信息化系统进行有效整合基础上,借鉴新 一代的感知-传输-应用技术体系,实现对码头、船舶、货物、重 大危险源、危险货物装卸过程、航管航运等管理要素的全面感知、 有效传输和按需定制服务,为行政管理人员和相关单位及人员提 供高效的管理辅助,并为公众提供便捷、实时的水运信息服务。 建立信息整合、交换和共享机制,建立健全信息化管理支撑 体系,以及相关标准规范和安全保障体系;按照“绿色循环低碳” 交通的要求,搭建高效、弹性、高可扩展性的基于虚拟技术的信 息基础设施,支撑信息平台低成本运行,实现电子政务建设和服务模式的转变。 实现以感知港口、感知船舶、感知货物为手段,以港航智能 分析、科学决策、高效服务为目的和核心理念,构建“智慧港口”的发展体系。 结合“智慧港口”相关业务工作特点及信息化现状的实际情况,本项目具体建设目标为: 一张图(即GIS 地理信息服务平台) 在建设岸线、港口、港区、码头、泊位等港口主要基础资源图层上,建设GIS 地理信息服务平台,在此基础上依次接入和叠加规划建设、经营、安全、航管等相关业务应用专题数据,并叠 加动态数据,如 AIS/GPS/移动平台数据,逐步建成航运管理处 "一张图"。系统支持扩展框架,方便未来更多应用资源的逐步整合。 现场执法监管系统 基于港口(航管)执法基地建设规划,依托统一的执法区域 管理和数字化监控平台,通过加强对辖区内的监控,结合移动平 台,形成完整的多维路径和信息追踪,真正做到问题能发现、事态能控制、突发问题能解决。 运行监测和辅助决策系统 对区域港口与航运业务日常所需填报及监测的数据经过科 学归纳及分析,采用统一平台,消除重复的填报数据,进行企业 输入和自动录入,并进行系统智能判断,避免填入错误的数据, 输入的数据经过智能组合,自动生成各业务部门所需的数据报 表,包括字段、格式,都可以根据需要进行定制,同时满足扩展 性需要,当有新的业务监测数据表需要产生时,系统将分析新的 需求,将所需字段融合进入日常监测和决策辅助平台的统一平台中,并生成新的所需业务数据监测及决策表。 综合指挥调度系统 建设以港航应急指挥中心为枢纽,以各级管理部门和经营港 口企业为节点,快速调度、信息共享的通信网络,满足应急处置中所需要的信息采集、指挥调度和过程监控等通信保障任务。 设计思路 根据项目的建设目标和“智慧港口”信息化平台的总体框架、 设计思路、建设内容及保障措施,围绕业务协同、信息共享,充 分考虑各航运(港政)管理处内部管理的需求,平台采用“全面 整合、重点补充、突出共享、逐步完善”策略,加强重点区域或 运输通道交通基础设施、运载装备、运行环境的监测监控,完善 运行协调、应急处置通信手段,促进跨区域、跨部门信息共享和业务协同。 以“统筹协调、综合监管”为目标,以提供综合、动态、实 时、准确、实用的安全畅通和应急数据共享为核心,围绕“保畅通、抓安全、促应急"等实际需求来建设智慧港口信息化平台。 系统充分整合和利用航运管理处现有相关信息资源,以地理 信息技术、网络视频技术、互联网技术、移动通信技术、云计算 技术为支撑,结合航运管理处专网与行业数据交换平台,构建航 运管理处与各部门之间智慧、畅通、安全、高效、绿色低碳的智 慧港口信息化平台。 系统充分考虑航运管理处安全法规及安全职责今后的变化 与发展趋势,应用目前主流的、成熟的应用技术,内联外引,优势互补,使系统建设具备良好的开放性、扩展性、可维护性。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值