当前位置:首页 > shell
  • 如何通过程序执行shell命令并获取命令执行结果?

    时间:2021-03-01 关键词: shell Linux

  • 教你在linux系统中创建文本菜单

    在linux中创建文本菜单 当使用Linux系统时,最常见的Shell脚本交互类型是应用菜单(文本菜单),文本菜单的核心是case命令。 H. L.使用case命令完成菜单交互。 让我们在下面创建一个简单的脚本。 在Linux系统中运行文本菜单。 先看一下菜单效果: 脚本内容: [root@localhost ~]# cat menutext.sh #!/bin/bash function menu { clear echo -e "\t\t\tDisplay Computer Info Menu\n" echo -e "\t1. Display disk space" echo -e "\t2. Display memory usage" echo -e "\t0. Exit program\n\n" echo -en "\t\tEnter option: " read -n 1 option } function diskinfo { clear df -k } function meminfo { clear cat /proc/meminfo } while [ 1 ] do menu case $option in 0) break ;; 1) diskinfo ;; 2) meminfo;; *) clear echo "Sorry, wrong selection";; esac read -n 1 line done clear 菜单显示是通过echo语句实现,echo命令的使用方法请参阅以前的文章《linux系统中的最常用命令之一-echo》。 菜单内容是通过自定义的函数实现,函数的调用通过case来实现。 获取输入信息,通过read命令实现,-n 1限制只读取一个字符,使用者只需输入一个数字,不用按回车就可以实现调用。 在此页面我们,我们点任意键,回到菜单。 当我们输入0时,退出程序运行。是不是非常简单,脚本也非常简单。

    时间:2020-09-24 关键词: 文本菜单 shell Linux

  • Linux shell和基本的linux命令

    由于缺乏直接的内核编译准则,著名的XDA开发人员Droidzone决定专门为开发人员创建自己的内核。 本指南包含一个交互式菜单和以下主题:-获取源代码 –设置编译框并准备源代码–设置内核参数 –编译和分发内核 对于说该语言的人来说,所有这些都很好解释。在凝视Ubuntu Box之前,您将需要一个工具链-Android NDK或您自己的工具链,htcdevs.com的HTC Desire GB / Froyo源或github的源,更重要的是熟悉linux shell和基本的linux命令。 最初由Droidzone [DEV]发布内核开发HOWTO和Interactive菜单 我还没有找到编译内核的简单指南。他们中有些人承担太多,有些则过时了。所以我想我会为开发人员/开发人员编写自己的。

    时间:2020-09-20 关键词: ubuntu shell Linux

  • Linux shell脚本攻略

    任何初学者都可以在Internet上轻松获得基本的Linux和Linux Shel教程。 但是,在使用shell解决现实世界中的问题时,大多数相关的知识和技能在论坛或博客中分散或不够广泛。 要么不容易找到。 如果遇到此问题,则最好阅读“ Linux Shell脚本指南”一书。 Linux可谓是一款不同凡响的操作系统,它拥有一个稳定、可靠且极其强大的完备的开发环境。作为与操作系统进行沟通的原生界面,shell能够控制整个操作系统的运作。理解shell脚本可以让你更好地了解操作系统,同时还能帮助你通过短短几行脚本自动地将大部分手头工作搞定,从而节省大量的时间。shell脚本可以和许多外部命令行工具结合起来完成信息查询、简化文本处理、调度任务运行时间、生成报表以及发送邮件之类的工作。尽管不少shell命令也配有对应的文档,但是仍然不太好理解。 本书通过细致剖析实际应用中的110多个案例,使许多看似复杂的Linux shell脚本任务迎刃而解。 第I章涵盖了如终端打印、数学运算、數组、操作符、函数、别名、文件重定向等可以通过Bash脚本来完成的一系列初级任务。作为入1了篇,本章目的在于让读者掌握Bash中的基本概念及特性。 第2章展示了GNU/Linux下多个命令在不同情境下的实战用法。介绍了cat、ma5sum、find.tr. sort. uniq. apit、rename、 1ook等重要命令。本章考查了用户可能会遇到并可借鉴的各种切实可行的用例。 第3章包含了多个与文件和文件系统相关的任务攻略。本章演示了如何生成大体积文件,将文件系统写入文件并挂载,查找井删除重复文件,统计文件行數,创建ISO镜像,收集文件细节信息、符号链接操作、文件权限及属性的详情,等等。 第4章以大量实例讲解了GNU/Linux下大部分命令行文本处理工具,同时还细致描述了正则表达式及sed和awk等命令。本章在各种实例中就大多数常见的文本处理任务,详细地剖析了其解决方案。 第5章包含了多个与Internet和Web相关的shel脚本,旨在帮助读者了解如何使用shell脚本同Web打交道,从而实现采集及解析Web页面数据,以POST和GET的方式发送用户数据,编写Web服务的客户端,下载Web页面等任务的自动化处理。 第6章结合脚本实例,演示了用于数据备份、归档、压缩等的若干命令以及用法。本章还介绍了tar. gzip. bunzip. cpio, 1zma. dd. rsyne. git. squashfs等命令, 并讨论了一些重要的加密技术。 第7章讨论了Linux环境下的联网实践以及一-些有助于编写基于网络的shell脚本的命令。为了照顾新手,本章开头先介绍了一些网络基础知识。接下来的重头戏包括借助SSH实现无密码登录,通过网络传送文件,列出网络中的活动主机,以多播方式进行消息传播,等等。 第8章考查了Linux系统活动监视相关的实例以及8志记录和报表生成。本章讲解了诸如计算磁盘使用情况,监视用户访问、CPU占用、syslog. 查看常用命令等任务。 第9章包含一系列系统管理方面的实战攻略。它介绍了用于完成系统信息采集、使用脚本进行用户管理、向用户发送消息、大图片缩放、通过hell访向MySQL数据库等任务的各种命令。

    时间:2020-09-01 关键词: 脚本 shell Linux

  • 第一阶段-Linux和高并发

    为了使每个人都容易学习,我们将不断更新大数据学习课程,为每个人提供优质的教育。 大数据平台都是在Linux环境下运行的,学习Linux能更好的理解大数据技术架构和原理。 第一阶段-Linux和高并发 1、Linux 基础2、Linux 初级3、Linux 文本操作4、Linux 文本分析5、Linux 管理6、Linux 安装管理7、Linux 高级8、Linux 脚本编程9、Linux 脚本案例10、网络基础11、四层负载均衡12、Keepalive 高可用13、Nginx 原理与配置14、Nginx 反向代理与负载均衡15、Session 和缓存 以下为划重点 ◆ 可掌握的核心技能 √ 操作系统发展历史 √ Linux 系统安装使用 √ Shell 脚本编写 √ Linux 文件系统操作及权限操作 √ grep、sed、awk 操作 √ Linux 软件安装与进程管理 √ TCP/IP 协议 √ LVS、DNAT、DR、TUN 模式及调度算法 √ keepalived 原理及使用 √ Nginx √ Session 一致性 ◆ 学习目的 这章是基础课程,帮大家进入大数据领域打好 Linux基础,以便更好地学习 Hadoop, MapReduce,Yarn,Storm,Spark,Flink 等众多课程。因为企业中无一例外的是使用Linux来搭建或部署项目。 ◆ 可解决的现实问题及价值所在 通过本阶段的学习大家将会了解大数据的源头,数据从何而来,继而更好的了解大数据。并且通过学习如果处理大型网站高并发问题反向更深入的学习了 Linux,同时站在了更高的角度去触探架构,企业中如何使用 Linux。

    时间:2020-08-07 关键词: 高并发 shell Linux

  • 你清楚Linux控制台、终端与shell及它们的关系吗?

    当使用Linux时,我们经常会遇到终端和外壳程序的概念。 例如,在桌面版Ubuntu中,我们可以右键单击桌面,然后单击“打开终端”以打开终端。 此时,我们可以在终端中输入Linux命令。 可能有人会问,这不是错字吗? 那么终端和外壳之间是什么关系呢? 1什么是终端 对于什么是终端,我们先看一个定义。可以看出终端就是一个输入输出设备,简单的可以理解为鼠标,键盘和显示器。但是这个好像跟Linux中终端的概念有些出入,下面听我来娓娓道来。 a combination of a keyboard and output device (such as a video display unit) by which data can be entered into or output from a computer or electronic communications system. 但如果想理解了解什么是终端,还需要从“远古”时期说起。在1970年之前,那个时候还没有个人电脑。那个使用只有大型机和小型机,也就是衣柜那么大的计算机。当时比较著名的计算机如DPD-7和GE-45等。 当时Ken Thompson和Dennis Ritchie(就是下图中的两位大神)负责在DPD-7上面开发一个新的操作系统,没错,就是UNIX操作系统。为了提高计算机的使用效率,他们打算让这个操作系统支持多个用户同时使用这台计算机。 但是,当时的显示器是一个非常贵的设备,不太可能每个人都有一个显示器。因此两个人想出了一个变通的方法。他们选择了便宜的电传打字机来做终端设备。这个电传打字机(TeleType)就是ASR33,就是下图这个设备。 这个设备通过键盘将信息输入计算机当中,而计算机的输出则是通过上面的纸打印出来。这样UNIX就成为世界上第一个支持多用户的操作系统,而ASR33则成为第一个Unix终端。后来,缩写TTY也就是用来表示Unix或者Linux终端了。 随着技术的发展和硬件价格的不断降低,终端也变得越来越先进和便宜。1970年,DEC发明了VT05视频终端。就是下面这个东东,可以看出她有个小显示器。也越来越像现在的键盘显示器了。 聊到这里我们知道了,所谓终端,其实就是一个物理设备,也就是计算机的输入输出设备。 2什么是控制台 在上个世纪70年代,终端是通过线缆连接在主机上的。同时,在主机上还有一种特殊终端,它是直接集成在主机上的。这个特殊的终端被称为控制台。这个终端的特点是只能被管理员使用。每一个计算机只有一个控制台,它在外观上与普通终端并没有太大的差异,但最重要的是控制台可以做一些普通终端不能做的事情。 比如当操作系统出现启动失败的时候,它会打印一些信息到控制台上,但终端并不会收到该信息。另外,当操作系统以单用户模式启动的时候,我们就只能通过使用控制台来登录了。这个时候其它终端是没有权限登录的。 3Linux操作系统的终端模拟器 前面我们了解到终端实际上是硬件设备,但是前面我们在Ubuntu上可以用菜单打开一个终端(Open Terminal)。其实,我们打开的这个窗口也是一个终端,我们称这个终端为终端模拟器,它是用软件的方式来模拟一个终端设备。有的时候我们又称它为虚拟终端。 如果你使用的是gnome终端,我们可以通过下面命令看一下它的帮助问答。 man gnome-terminal 可以看出gnome-terminal就是一个终端模拟程序,而它的功能就是访问Unix shell。 gnome是用来模拟Xterm的,而Xterm本身也是一个终端模拟器。它模拟了VT102物理终端。 打开Linux虚拟终端的方法有很多种,如果我们使用的是桌面版的Linux,也就是图形界面版的。那么通常我们可以通过命令打开一个命令行终端。如下所示。 另外,Linux操作系统起来的时候默认是有7个虚拟终端的。这些虚拟终端并非前面所说的在桌面中打开的虚拟终端,而是通过显示器直接显示的。我们可以通过快捷键在这些终端之间进行切换,比如Ctrl+Alt+ F1可以切换到第一个终端,而Ctrl+Alt+ F2可以切换到第二个终端,以此类推Ctrl+Alt+F7可以切换到第七个终端。通常情况下对于图形界面来说,第七个是图形终端,其它是文字终端。 通过前面的介绍,我们从外面理解了关于终端、控制器和虚拟终端等概念。也对Linux操作系统中虚拟终端有所了解。接下来我们将进一步的深入介绍到Linux的内部。 4什么是Shell 其实我们在前面文章中介绍过关于Shell的内容。Shell其实就是一个应用程序,它实现了用户对操作系统访问的接口。比如我们常见的管理文件,用户和网络资源等等,都是通过Shell来完成的。 Shell是一个应用程序,同时它又有很多具体的实现,比较常见的包括Bash、Zsh、 Csh和Ksh等等。 我们前面了解到终端是个物理设备,它被用户用来输入和现实信息,而目前我们使用的虚拟终端则是对物理设备的模拟。Shell则是用来执行用户命令的。这样我们现在就很容易理解终端和Shell的关系。 如果我们通过桌面版打开一个虚拟终端的话,那么终端和Shell的关系如下图所示。 如果我们不是通过本地的设备连接的,而是通过网络来访问计算机的话,那么其关系如下图所示。可以看出,这里面有个pty的组件起了比较关键的作用,它建立了两者之间的关联。 1Linux系统中的tty、pty和pts 前面我们从概念层面对终端、控制台和shell等进行了介绍。但是这些概念在Linux操作系统中是怎样的呢?它们之间的关系又是怎样的呢? 前面已经介绍过tty,它是一个终端,也就是一个输入输出设备的集合。而目前在Linux中都是通过虚拟终端来与计算机交互的,因此在Linux中tty其实就是虚拟终端,可以将其理解为一个软件。如果我们同时按住Ctrl+Alt+F5就可以切换到虚拟终端5,具体如下。 在Linux操作系统中,软件的整体架构要复杂一些,这是因为Linux不仅仅要支持虚拟终端,还有能够支持键盘显示器的物理外围设备,还要支持通过telnet或者ssh等网络的形式的连接。如下图给出了一个完整的示例。 为了支持不同类型的接入方式,在Linux实现了一个伪终端的概念,也就是pty。其中p是pseudo的缩写。 伪终端分为两部分,如上图所示,包括master和slave两部分。其中master实现了对不同接入方式的适配,它实现对来自不同设备或者软件消息的解析,将结果传输给slave;而slave端其实就是一个虚拟终端,它实现了与shell的交互,对于shell来说,ptsiu是一个终端设备。 可能还是不太好理解,我们举一个具体的例子,比如telnet实现对远程计算机的管理,其实在客户端就是发送的各种字符串,通过网络发送给telnet守护进程,然后telnet守护进程调用master的功能实现解析。 今天我们主要从概念和架构的层面介绍了终端、控制台和Shell等概念,并介绍了Linux操作系统中常见的诸如tty、pty和pts等名称。后面我们以一个具体的实例来让大家更加清楚的理解上述架构。

    时间:2020-08-02 关键词: 终端 控制台 shell Linux

  • Linux私房菜

    《鸟哥的Linux私房菜基础学习篇》内容广泛而全面,对基本概念的解释非常详尽且易于理解。 各种功能和命令的引入伴随着大量的操作示例和详细分析。 这本书是初学者学习Linux的好书。 本书是最具知名度的Linux入门书《鸟哥的Linux私房菜基础学习篇》的最新版,全面而详细地介绍了Linux操作系统。全书分为5个部分:第一部分着重说明Linux的起源及功能,如何规划和安装Linux主机;第二部分介绍Linux的文件系统、文件、目录与磁盘的管理;第三部分介绍文字模式接口 shell和管理系统的好帮手shell脚本,另外还介绍了文字编辑器vi和vim的使用方法;第四部分介绍了对于系统安全非常重要的Linux账号的管理,以及主机系统与程序的管理,如查看进程、任务分配和作业管理;第五部分介绍了系统管理员(root)的管理事项,如了解系统运行状况、系统服务,针对登录文件进行解析,对系统进行备份以及核心的管理等。 《鸟哥的Linux私房菜基础学习篇》所有内容是学习Linux的基础,这些内容是基础中的基础,如果您能将其中的文字都看完并且消化过,那么未来在管理Linux主机以及架设网站方面,就能够达到“事半功倍”的成效,请不要忽略这些内容了!否则,再怎么讨论都是枉然的啦!^_^。Linux的资料非常的多,每份资料彼此的相关性都很强,要单独的一项一项讲解并不容易,那么这本书件该怎么看呢?建议先按照顺序将内容大致浏览过一次,看不懂的地方也可以先略过不要紧。全部看完之后,再从头开始“仔细”的实际操作过一遍,那应该就能够进入Linux的世界啰~另外,每个章节下面的日期,指的是重大改版日期而非最新日期,最新日期请以该章节结束部分的工作日志为主的喔!

    时间:2020-08-01 关键词: 主机 shell Linux

  • ubuntu系统环境变量和shell脚本

    【1】配置环境变量 保存系统启动相关,或者系统配置相关的变量。 在系统中可以通过env命令打印系统当前的环境变量 HOME=/home/linux #linux用户家目录 PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin: /usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games #可执行程序的路径 1.添加只对当前终端生效的环境变量 export PATH=${PATH}:/home/linux/DC20052/day2 2.添加只对当前用户生效的环境变量 .bashrc (在用户家目录下) export PATH=${PATH}:/home/linux/DC20052/day2 重启ubuntu生效 3.添加对所有用户生效的环境变量 sudo vi /etc/environment PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin: /usr/bin:/sbin:/bin:/usr/games:/home/linux/DC20052/day2/" 重启生效 【2】网络相关命令 (1)网络基础 1.ip:主机在网络中的一个编号,这个编号就是ip地址 2.ip组成:网络号+主机号 组成 3.ip表示方式:点分十进制 4.ip的种类:ipv4 (4字节,32bit) ipv6(16字节,128bit) 5.ipv4的网段划分 网络号 主机号 最高位 范围 用单位 A 1字节 3字节 0 [0-127] 政府/大公司/学校 B 2字节 2字节 10 [128-191] 中等规模的公司 C 3字节 1字节 110 [192-223] 个人 192.168.1.255 广播地址 D 1110 [224-239] 组播 E 11110 [240-255] 未使用(实验室) A:0.0.0.0 - 127.255.255.255 B:128.0.0.0-191.255.255.255 C:192.0.0.0-223.255.255.255 D:224.0.0.0-239.255.255.255 E:240.0.0.0-255.255.255.255 6.子网掩码 子网掩码:获取网络编号 192.168.1.160 &255.255.255.0 192.168.1.0 7.网关 和外网通讯的ip地址,叫网关,一般咱们认为交换机的ip地址 就是网关 8.DNS 域名解析器 www.baidu.com -->182.61.200.7 域名解析服务器的地址 8.8.8.8 114.114.114.114 (2)命令 1.查看网络的命令 ifconfig 2.设置网络(图形界面) address : 192.168.1.250 netmask : 255.255.255.0 gateway : 192.168.1.1 DNS : 8.8.8.8 3.重启网络管理服务 sudo service network-manager restart 4.测试 ping www.baidu.com PING www.a.shifen.com (182.61.200.7) 56(84) bytes of data. 64 bytes from 182.61.200.7: icmp_req=1 ttl=53 time=4.56 ms 静态配置网络 sudo vi /etc/network/interfaces auto eth0 iface eth0 inet static address 192.168.1.210 netmask 255.255.255.0 gateway 192.168.1.1 broadcast 192.168.1.255 dns-nameservers 8.8.8.8 重启: sudo /etc/init.d/networking restart sudo service network-manager restart 注意,上述重启之后需要修改配置文件,联网图标才能正常显示 ifupdown:managed=false ==>true /etc/NetworkManager/NetworkManager.conf. 测试: ping www.baidu.com 【3】shell编程 作业: 1.在自己的用户主目录下新建两个子目录subdir1 subdir2 2.将/etc/passwd文件拷贝到subdir1 ,将/etc/group 拷贝到subdir2 3.将subdir2重命名为subdir 4.对subdir1进行打包并且压缩成xz格式 5.将打包后的xz格式文件拷贝到subdir目录下 6.解压subidr目录下的压缩格式文件 7.查看subidr目录下所有的文件 把上述命令写在:test.sh 执行看效果 :chmod 0777 test.sh ./test.sh

    时间:2020-07-11 关键词: ubuntu shell Linux

  • Linux 桌面 GNOME Shell 全新用户体验界面公布

    GNOME是一个完全由自由软件组成的桌面环境,它可以在GNU / Linux、Solaris和大多数BSD系统上运行。 它是由志愿者开发的,是GNU项目的一部分。 GNOME 3.36 刚在上个月发布,GNOME 用户体验团队现在就已经努力为将于秋季发布的 GNOME 3.38 进行改进,希望进一步完善桌面的用户体验。 GNOME 用户体验团队成员 Allan Day 分享了他们一直在合作的一些领域,以便在 GNOME Shell 中进一步改进。其中一些正在讨论的进一步改进的领域包括: 改进应用程序的网格启动器 改进 GNOME Shell 上 Activities Overview 的空间组织 改进系统启动后 GNOME 桌面的显示内容 改进触摸板导航和手势处理 应用启动 改进应用程序网格启动器,确保最常用/可能使用的应用程序首先出现,而不是按字母顺序进行排列。此外,用户体验设计师还希望让它“更具吸引力和个性化”。 改进 Activities Overview 的空间组织 熟悉的布局方式是:中间为当前运行应用的窗口缩略图、左侧为 dash 栏、顶部搜索框以及右侧的工作区。GNOME 用户体验团队希望进一步改进布局,为不同元素的排列更好地传达出它们之间的关系,特别是在导航方面。 改进初始状态的桌面显示 GNOME 用户体验团队希望避免在启动到新的 GNOME 桌面环境时出现空的 Activities Overview 和空桌面。 改进触摸板导航和手势处理 团队希望能够使用触摸板在桌面的不同区域之间使用同一套手势进行导航(尤其是应用启动和搜索)。

    时间:2020-04-17 关键词: gnome shell Linux

  • Linux工程师必备的7个关键技能和必读书目

    随着Internet技术的发展,对Linux操作和维护工程师的需求已大大增加。 作为通用操作系统,Linux无法完全理解操作系统的所有方面,并且在短时间内是不现实的。 本文总结了Linux操作和维护工程师在早期阶段必须掌握的内容。 您可以有目的地学习和练习,并努力尽快成为一名出色的运维工程师。 Linux操作系统基础知识 作为Linux运维工程师,操作系统的基础知识自然是最为基础的。操作系统主要负责对存储(磁盘管理、文件管理等)、计算(进程状态等)和网络资源(网卡配置,IP配置,流量监控等)的管理和调度,因此对于运维工程师来说最重要的也是学会这几方面的工具。这些工具分为配置管理和监控查询等类型。 当然,市面上这方面的图书也是非常多,大家反响比较好的有两本书,一本书是《鸟哥的Linux私房菜》系列,另外一本是《UNIX/Linux系统管理技术手册(第四版)》。鸟哥的这本书建议先阅读基础版的,里面内容很基础,讲解的也很详细。 《UNIX/Linux系统管理技术手册(第四版)》则是一本非常全面的技术手册,可以当作工具书来用。其中不仅仅介绍了Linux的操作系, 主流类UNIX的配置管理都有介绍,非常适合运维人员使用。毕竟很多数据中心不仅仅是Linux,还有很多UNIX系统。 网络服务 涉及运维的企业大多是对外提供服务的企业,以互联网公司居多。自然网络服务是其最主要的服务之一了。在Linux操作系统上网络服务的类型很多,大致上有Web服务、共享文件服务和邮件服务等几类。当然这只是常见的几类,其实还要多得多。 以Web服务为例,通常LAMP和LNMP是必须要熟练掌握的。这里LAMP是一系列软件的缩写,分别是Linux、Apache、MySQL和PHP。而LNMP中的N是Nginx的缩写。对于运维人员来说,主要是Apache和Nginx的安装、配置和故障诊断修复。 当然,这里举了一个具体的例子。由于Linux的网络服务非常之多,具体还要根据自己从事的工作进行选择。具体可以参考鸟哥私房菜的服务器架设篇。 Shell脚本 Linux最大的特点是基于Linux命令行终端实现对操作系统的控制。这种方式虽然入门门槛较高,但是却大大提升了效率。Linux命令行终端最大的特点是可以支持自动化处理,也就是通过Shell脚本实现命令的批处理。 我们在日常运维的过程中经常需要执行一些命令,而且很多时候是一系列的,例行的命令。这时就用到Shell脚本了。比如我们要监控系统CPU的使用情况,并且定时地记录在一个文本文件中,此时脚本就派上用场了。作为运维工程师,Shell脚本是必学的内容。 正则表达式与文本处理 运维工程师最常见的工作可能就是分析日志和调整配置文件了。而这些文件都是文本文件,因此学习文本文件的处理是非常必要的。比如我们要在海量日志中检索某个关键字符串,或者减少日志中某个时间段的日志等等。 对于文本文件分析常用的命令包括grep、sort、sed和awk等。其中sed和awk的功能尤其强大,可以借助正则表达式对文本进行复杂的处理。因此在学习这些工具使用的情况下,还需要对正则表达式有所了解。对于正则表达式,本文推荐OReilly的《精通正则表达式》一书。 学习正则表达式不是一蹴而就的,需要在实践中不断学习。 监控工具 监控工具是运维工程师必须掌握的工具,开源的工具很多,比如cacti,nagios和zibbix等。很多大型的互联网公司都有自己开发的监控系统,这就另当别论了。 为什么要学习监控工具,因为对于大规模Web服务,我们不可能坐等问题发生,甚至问题发生了都不知道。而是需要在出现问题的时候进行告警,或者是做到预警,最好能做到在客户感知问题之前已经将问题解决。监控工具就是起到这个作用的,它将问题通过短信或者邮件的方式及时的告知运维人员,以便修复问题。 集群高可用 对于关键业务通常要做到7*24小时不中断,也就是高可用。以某东和某宝为例,如果出现一分钟的业务中断,估计要损失数百万,甚至数千万了。因此对于关键业务必须通过服务器集群的方式保证其高可用。 高可用在Linux操作系统中也有很多开源软件,很多公司也使用这些软件。比如用户负载均衡的LVS和Nginx,用户高可用的Linux-HA和KeepAlive等,还有数据库主备软件等等。这些软件不一定要精通,但原理一定要清楚。 数据备份与恢复 数据就是企业的生命,如果一个企业出现丢失数据的情况,那么这个公司离倒闭也就不远了。因此,对于运维人员来说,学习数据备份和恢复也是不可或缺的。 关于数据备份方面有很多商业的软件,本文不再赘述。在Linux操作系统中其实也有很多备份的软件。比如网络存储NFS,它可以作为数据的集中备份服务器,实现业务服务数据的备份;rsync工具,可以实现数据的差量备份等等。 今天本号总结了Linux运维必须要知道的Linux相关技术和知识点,这里仅是抛砖引玉,希望对刚入门的运维工程师有所帮助。另外,为了大家能够深入地学习,本文推荐了基本不错的图书。相信大家通过不断的学习和实践,一定能够成为一名优秀的运维工程师。

    时间:2020-04-13 关键词: web shell Linux

  • 管理你的Shell环境

    前段时间,Fedora Magazine 发表了一篇 介绍 ZSH 的文章,它是 Fedora 默认的 bash shell 的替代品。这一次,我们将着重定制它来更有效地使用它。本文中显示的所有概念也适用于其他 shell,例如 bash。 别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: $ alias yourAlias='complex command with arguments' 它们并不总是用来缩短长命令。重要的是,你将它们用于你经常执行的任务。可能的例子: $ alias dnfUpgrade='dnf -y upgrade' 这样,为了进行系统升级,我只需输入 dnfUpgrade 而不用输入完整的 dnf 命令。 在终端中设置别名的问题是,一旦终端会话关闭,别名就会丢失。要永久设置它们,请使用资源文件。 资源文件 资源文件(即 rc 文件)是在会话或进程开始时(每个用户在开启新终端窗口或启动 vim 等新程序时)加载的配置文件。对于 ZSH,资源文件是 .zshrc,对于 bash,它是 .bashrc。 要使别名成为永久别名,你可以将它们放入资源文件中。你可以使用你选择的文本编辑器编辑资源文件。这里使用 vim: $ vim $HOME/.zshrc 或者对于 bash: $ vim $HOME/.bashrc 请注意,资源文件的位置是相对于家目录指定的。这是 ZSH(或 bash)默认为每个用户查找该文件的位置。 还有一种是将你的配置放在任何其他文件中,然后读取它: $ source /path/to/your/rc/file 同样,在会话中直接读取它只会将其应用于会话,因此要使其永久化,请将 source 命令添加到资源文件中。将文件放在不同位置的优点是你可以随时读取它。这在共享环境中很有用。 环境变量 环境变量是分配了特定名称的值,你可以在脚本和命令中调用它们。它们以美元符号($)开始。其中最常见的是指向主目录的 $HOME。 顾名思义,环境变量是你环境的一部分。使用以下语法设置变量: $ http_proxy="http://your.proxy" 要使其成为环境变量,请使用以下命令将其导出: $ export $http_proxy 要查看当前设置的所有环境变量,请使用 env 命令: $ env 该命令输出会话中可用的所有变量。要演示如何在命令中使用它们,请尝试运行以下 echo 命令: $ echo $PWD/home/fedora$ echo $USERfedora 这里发生了变量扩展,即存储在变量中的值在命令中使用。 另一个有用的变量是 $PATH,它定义了 shell 查找二进制文件的目录。 $PATH 变量 有许多对于操作系统很重要的目录或文件夹(在图形环境中调用它们的方式)。某些目录设置为保存可直接在 shell 中使用的二进制文件。这些目录在 $PATH 变量中定义。 $ echo $PATH/usr/lib64/qt-3.3/bin:/usr/share/Modules/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/usr/libexec/sdcc:/usr/libexec/sdcc:/usr/bin:/bin:/sbin:/usr/sbin:/opt/FortiClient 当你希望在 shell 中访问自己的二进制文件(或脚本)时,这会有帮助。

    时间:2019-07-14 关键词: 命令行 shell Linux

  • shell中管道、grep、sed、awk用法

    在shell的高级用法里经常看到这几个。 管道| 管道命令是将上一条命令的standard output作为下一条命令的standard input。grep: 可使用正则表达式匹配文本并输出该行。 grep [options] 文件[options]主要参数: -c:只输出匹配行的计数。 -I:不区分大 小写(只适用于单字符)。 -h:查询多文件时不显示文件名。 -l:查询多文件时只输出包含匹配字符的文件名。 -n:显示匹配行及 行号。 -s:不显示不存在或无匹配文本的错误信息。 -v:显示不包含匹配文本的所有行。 pattern正则表达式主要参数: : 忽略正则表达式中特殊字符的原有含义。 ^:匹配正则表达式的开始行。 $: 匹配正则表达式的结束行。

    时间:2019-07-05 关键词: shell

  • Linux学习之shell基础

    今天开始学习Ubuntu系统中的shell基础命令,首先简要的介绍下什么是shell。 在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器)。它类似于DOS下的command和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。 shell可以分为一:图形界面shell(Graphical User Interface shell 即 GUI shell)二:命令行式shell(Command Line Interface shell,即CLI shell) shell基本命令: 1.安tab键可以补全命令 2.sudo passwd root 可以改root密码 3.su进入超级管理员界面

    时间:2019-07-04 关键词: shell Linux

  • shell 脚本使用

    1. 根据makefile文件中编译选项进行不同的打包。#CLOUD is the define cloud_str="CLOUD" prod_name_str=`cat buildscript/Makefile |grep -m 1 "PRODUCT_NAME"` prod_name=`echo ${prod_name_str#*=}` prod_name_select=`cat buildscript/Makefile |grep -m 2 $prod_name|grep -v ":="` cloud_sw=`cat buildscript/Makefile |grep -A 5 "$prod_name_select"|grep $cloud_str` echo $prod_name $cloud_sw2. 根据当前image打包名,包名自加1,避免覆盖处理pwd_path=`pwd` file_prefix="images_v x.x.x.x" file_suffix=".7z" i=1 file_name=$file_prefix"("$i")"$file_suffix while  [ 1 ] do #echo $pwd_path $file_name if [ -f $pwd_path/$file_name ];then i=$[i+1] file_name=$file_prefix"("$i")"$file_suffix echo $pwd_path $file_name else touch $pwd_path/$file_name break fi done echo "done"

    时间:2019-07-04 关键词: shell

  • 使用shell完成对读取文本中的路径并删除

    FILENAME="del.txt" while read LINE do #echo $LINE|tr -d 'r' LINE_D=`echo $LINE|tr -d 'r'` rm "$LINE_D" -rf echo $LINE_D done < $FILENAME #rm "$LINE"

    时间:2019-06-12 关键词: shell

  • shell_2

    LPCTSTR lpFile;LPCTSTR lpParameters;LPCTSTR lpDirectory;int nShow;HINSTANCE hInstApp;LPVOID lpIDList;LPCTSTR lpClass;HKEY hkeyClass;DWORD dwHotKey;union {HANDLE hIcon;HANDLE hMonitor;} DUMMYUNIONNAME;HANDLE hProcess;} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO; 在C#中其结构为public struct SHELLEXECUTEINFO // 用于 ShellExecuteEx{public int cbSize;public int fMask;public int hwnd;public string lpVerb; public string lpFile;public string lpParameters;public string lpDirectory;public int nShow;public int hInstApp;public int lpIDList;public string lpClass;public int hkeyClass;public int dwHotKey;public int hIcon;public int hProcess;} 参数详解:cbSize 存储该结构的长度,以字节为单位。fMask一个标志数组,用来设置其他成员的有效性 SEE_MASK_CLASSKEY         0x3SEE_MASK_CLASSNAME         0x1SEE_MASK_CONNECTNETDRV     0x80SEE_MASK_DOENVSUBST         0x200SEE_MASK_FLAG_DDEWAIT     0x100SEE_MASK_FLAG_LOG_USAGE     0x4000000SEE_MASK_FLAG_NO_UI         0x400SEE_MASK_HMONITOR         0x200000SEE_MASK_HOTKEY         0x20SEE_MASK_ICON             0x10SEE_MASK_IDLIST         0x4SEE_MASK_INVOKEIDLIST     0xCSEE_MASK_NOASYNC         0x100000SEE_MASK_NOCLOSEPROCESS     0x40SEE_MASK_NOZONECHECKS     0x800000SEE_MASK_NO_CONSOLE         0x8000SEE_MASK_UNICODE         0x100000SEE_MASK_FILEANDURL         0x4000000 hwnd调用这个 ShellExecuteEx 的窗口句柄lpVerb设定这个 ShellExecuteEx 的动作,包括: edit 打开编辑器编辑文档,如果 lpFile 不是一个文档,则这个函数会失败 explore 以 lpFile 为路径打开资源管理器 find 从指定目录开始搜索open根据 lpFile 打开对应文件,该文件可以为可执行文件、文档或者文件夹 print根据 lpFile 打印文档,若 lpFile 不是一个文档则该函数会失败 properties 显示文件或文件夹的属性lpFile以 /0 结尾的字符串,指出 lpVerb 的操作对象的路径,被系统支持的操作包括文本的 open 、 print 等,其中 print 要求必须有一个已经注册的打印机,而其他种类的文档会通过系统关联进行查询执行。若要设置一个空的 namespace ,则需要设置 fMask 的值为 see_mask_invokeidlist。注意: 若 see_mask_invokeidlist 已设置,则可以藉由 lpFile 或者 lpIDList 确定 item 的系统路径或者 PIDLlpParameters运行 / 打开程序的参数,如果打开的是一个文档,则该项无效lpDirectory指明工作目录的名字,成员没有说明,则默认为当前目录nShow说明 ShellExecuteEx 打开的程序将以什么形式出现hInstApp如果函数运行成功,该项的值将大于 32 ,否则会是下列错误对应的值 SE_ERR_FNF 没有找到文件 SE_ERR_PNF没有找到路径 SE_ERR_ACCESSDENIED 拒绝访问 SE_ERR_OOM 内存不足 SE_ERR_DLLNOTFOUND 没有找到动态链接库 SE_ERR_SHARE 不能操作一个以打开的文件 SE_ERR_ASSOCINCOMPLETE 文件关联信息不完整 SE_ERR_DDETIMEOUT DDE 操作超时 SE_ERR_DDEFAIL DDE 操作失败 SE_ERR_DDEBUSY DDE 繁忙 SE_ERR_NOASSOC 没有找到文件关联lpIDList一个 itemidlist 结构的地址,用来存储成员的特别标识符,当 fMask 不包括 see_mask_idlist 或 see_mask_invokeidlist 时该项被忽略lpClass用以指明文件类别的名字或 GUID ,当 fMask 不包括 see_mask_classname 时该项被忽略hkeyClass获得已在系统注册的文件类型的 Handle ,当 fMask 不包括 see_mask_classkey 时该项被忽略dwHotKey程序的热键关联,低位存储虚拟关键码( Key Code ),高位存储修改标志位 (HOTKEYF_) ,修改标志为( modifier flags )的详细列表请看 wm_sethotkey 消息的描述,当 fmask 不包括 see_mask_hotkey 时该项被忽略DUMMYUNIONNAME hIcon 取得对应文件类型的图标的 Handle ,当 fMask 不包括 SEE_MASK_ICON 时该项被忽略hMonitor 将文档显示在显示器上的 Handle ,当 fMask 不包括 SEE_MASK_HMONITOR 时该项被忽略hProcess用于进行 return 操作的成员,若 fMask 不设为 see_mask_nocloseprocess 则该项值为 null ,即使 fMask 设为 see_mask_nocloseprocess ,若没有进程启动,该项值仍为 null 。即没有新的进程启动,则该项值一只为 null 3 、说说 ShellExecuteExhttp://blog.csdn.net/kesalin/category/242901.aspx ShellExecuteEx Function对指定应用程序执行某个操作语法:BOOL ShellExecuteEx(          LPSHELLEXECUTEINFO lpExecInfo    );  参数:lpExecInfo[in, out]  一个指向 SHELLEXECUTEINFO 结构的指针,用来传递和保存应用程序执行相关的信息。返回值:如果函数成功执行就返回 TRUE ,否则返回 FALSE 。可调用 GetLastError 获取错误信息。备注:由于 ShellExecuteEx能够将执行委托给那些由组件对象模型 COM 激活的 Shell 扩展(数据源,上下文菜单句柄,动词实现),因此在调用 ShellExecuteEx之前要先初始化 COM 。某些 Shell 扩展要求单线程单元模型的 COM ,在这种情况下,应当像下面一般初始化 COM : CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)    在某些情况下 ShellExecuteEx并没有使用这种类型的 Shell 扩展 ,这时就无需初始化 COM 。虽然如此,总是在使用这个函数之前初始化 COM 是个不错的举措。如果有多个显示器,并且你指定了一个 HWND同时设置 lpExecInfo的成员 lpVerb为 "Properties" ,那么由 ShellExecuteEx创建的任何窗口都有可能显示在不正确的位置上。如果这个函数执行成功,它会设置 SHELLEXECUTEINFO的 hInstApp成员为一个大于 32 的值。如果函数执行失败, hInstApp成员被设置为 SE_ERR_XXX (提示失败的原因)。虽然为了兼容 16 位的 windows 应用程序 hInstApp被声明成一个句柄,但它并不是一个句柄。它只能被转型为整数,并同 32 或 SE_ERR_XXX 之类的错误代码比较。

    时间:2019-06-11 关键词: shell

  • Linux Shell中的 ()、(())、[]、[[]]、{} 详解

    一、小括号,圆括号() 1、单小括号 () ①命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。 ②命令替换。等同于`cmd`,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。有些shell不支持,如tcsh。 ③用于初始化数组。如:array=(a b c d) 2、双小括号 (( )) ①整数扩展。这种扩展计算是整数型的计算,不支持浮点型。((exp))结构扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码为1,或者 是"假",而一个非零值的表达式所返回的退出状态码将为0,或者是"true"。若是逻辑判断,表达式exp为真则为1,假则为0。 ②只要括号中的运算符、表达式符合C语言运算规则,都可用在$((exp))中,甚至是三目运算符。作不同进位(如二进制、八进制、十六进制)运算时,输出结果全都自动转化成了十进制。如:echo $((16#5f)) 结果为95 (16进位转十进制) ③单纯用 (( )) 也可重定义变量值,比如 a=5; ((a++)) 可将 $a 重定义为6 ④常用于算术运算比较,双括号中的变量可以不使用$符号前缀。括号内支持多个表达式用逗号分开。 只要括号中的表达式符合C语言运算规则,比如可以直接使用for((i=0;i<5;i++)), 如果不使用双括号, 则为for i in `seq 0 4`或者for i in {0..4}。再如可以直接使用if (($i<5)), 如果不使用双括号, 则为if [ $i -lt 5 ]。 二、中括号,方括号[] 1、单中括号 [] ①bash 的内部命令,[和test是等同的。如果我们不用绝对路径指明,通常我们用的都是bash自带的命令。if/test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。if/test结构中并不是必须右中括号,但是新版的Bash中要求必须这样。 ②Test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用,对于字符串比较可以使用转义形式,如果比较"ab"和"bc":[ ab < bc ],结果为真,也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示。 ③字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。作为test用途的中括号内不能使用正则。 ④在一个array 结构的上下文中,中括号用来引用数组中每个元素的编号。 2、双中括号[[ ]] ①[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。 ②支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。 ③使用[[ ... ]]条件判断结构,而不是[ ... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。 ④bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。 例子: if ($i<5) if [ $i -lt 5 ] if [ $a -ne 1 -a $a != 2 ] if [ $a -ne 1] && [ $a != 2 ] if [[ $a != 1 && $a != 2 ]] for i in $(seq 0 4);do echo $i;done for i in `seq 0 4`;do echo $i;done for ((i=0;i<5;i++));do echo $i;done for i in {0..4};do echo $i;done 三、大括号、花括号 {} 1、常规用法 ①大括号拓展。(通配(globbing))将对大括号中的文件名做扩展。在大括号中,不允许有空白,除非这个空白被引用或转义。第一种:对大括号中的以逗号分割的文件列表进行拓展。如 touch {a,b}.txt 结果为a.txt b.txt。第二种:对大括号中以点点(..)分割的顺序文件列表起拓展作用,如:touch {a..d}.txt 结果为a.txt b.txt c.txt d.txt # ls {ex1,ex2}.sh ex1.sh ex2.sh # ls {ex{1..3},ex4}.sh ex1.sh ex2.sh ex3.sh ex4.sh # ls {ex[1-3],ex4}.sh ex1.sh ex2.sh ex3.sh ex4.sh ②代码块,又被称为内部组,这个结构事实上创建了一个匿名函数 。与小括号中的命令不同,大括号内的命令不会新开一个子shell运行,即脚本余下部分仍可使用括号内变量。括号内的命令间用分号隔开,最后一个也必须有分号。{}的第一个命令和左括号之间必须要有一个空格。 2、几种特殊的替换结构 ${var:-string},${var:+string},${var:=string},${var:?string} ①${var:-string}和${var:=string}:若变量var为空,则用在命令行中用string来替换${var:-string},否则变量var不为空时,则用变量var的值来替换${var:-string};对于${var:=string}的替换规则和${var:-string}是一样的,所不同之处是${var:=string}若var为空时,用string替换${var:=string}的同时,把string赋给变量var: ${var:=string}很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。 ② ${var:+string}的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的) ③${var:?string}替换规则为:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。 补充扩展:在上面这五种替换结构中string不一定是常值的,可用另外一个变量的值或是一种命令的输出。 3、四种模式匹配替换结构 模式匹配记忆方法: # 是去掉左边(在键盘上#在$之左边) % 是去掉右边(在键盘上%在$之右边) #和%中的单一符号是最小匹配,两个相同符号是最大匹配。 ${var%pattern},${var%%pattern},${var#pattern},${var##pattern} 第一种模式:${variable%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最短的匹配模式 第二种模式: ${variable%%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式 第三种模式:${variable#pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern开始,如果是,就从命令行把variable中的内容去掉左边最短的匹配模式 第四种模式: ${variable##pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式 这四种模式中都不会改变variable的值,其中,只有在pattern中使用了*匹配符号时,%和%%,#和##才有区别。结构中的pattern支持通配符,*表示零个或多个任意字符,?表示仅与一个任意字符匹配,[...]表示匹配中括号里面的字符,[!...]表示不匹配中括号里面的字符。 # var=testcase # echo $var testcase # echo ${var%s*e} testca # echo $var testcase # echo ${var%%s*e} te # echo ${var#?e} stcase # echo ${var##?e} stcase # echo ${var##*e} # echo ${var##*s} e # echo ${var##test} case 4、字符串提取和替换 ${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern} 第一种模式:${var:num},这种模式时,shell在var中提取第num个字符到末尾的所有字符。若num为正数,从左边0处开始;若num为负数,从右边开始提取字串,但必须使用在冒号后面加空格或一个数字或整个num加上括号,如${var: -2}、${var:1-3}或${var:(-2)}。 第二种模式:${var:num1:num2},num1是位置,num2是长度。表示从$var字符串的第$num1个位置开始提取长度为$num2的子串。不能为负数。 第三种模式:${var/pattern/pattern}表示将var字符串的第一个匹配的pattern替换为另一个pattern。 第四种模式:${var//pattern/pattern}表示将var字符串中的所有能匹配的pattern替换为另一个pattern。 [root@centos ~]# var=/home/centos [root@centos ~]# echo $var /home/centos [root@centos ~]# echo ${var:5} /centos [root@centos ~]# echo ${var: -6} centos [root@centos ~]# echo ${var:(-6)} centos [root@centos ~]# echo ${var:1:4} home [root@centos ~]# echo ${var/o/h} /hhme/centos [root@centos ~]# echo ${var//o/h} /hhme/cenths 四、符号$后的括号 (1)${a} 变量a的值, 在不引起歧义的情况下可以省略大括号。 (2)$(cmd) 命令替换,和`cmd`效果相同,结果为shell命令cmd的输,过某些Shell版本不支持$()形式的命令替换, 如tcsh。 (3)$((expression)) 和`exprexpression`效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算。 五、使用 多条命令执行 (1)单小括号,(cmd1;cmd2;cmd3) 新开一个子shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后可以没有分号。 (2)单大括号,{ cmd1;cmd2;cmd3;} 在当前shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开。 对{}和()而言, 括号中的重定向符只影响该条命令, 而括号外的重定向符影响到括号中的所有命令。

    时间:2019-06-02 关键词: 嵌入式系统电路 分隔符 shell Linux

  • arm linux 控制台shell退出不能重启怎么办?

    很多时候,打开多个shell,这时候不小心输入了exit退出了最后一个,也就是系统启动时启动的那个sh,那么就再也无法在控制台输入shell指令进行交互了,只能重启系统,原来是需要修改一个参数,位于/etc/inittab文件里面: ::once:-/bin/sh 改成 ::respawn:-/bin/sh ,这样即使最后一个shell 被exit指令退出,仍然可以重启一个新的,这样就不需要重启系统了 ::respawn:-/bin/sh

    时间:2018-11-26 关键词: ARM shell Linux

  • 1分钟了解Ubuntu中Shell基础知识

    今天开始学习Ubuntu系统中的shell基础命令,首先简要的介绍下什么是shell。在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器)。它类似于DOS下的command和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。shell可以分为一:图形界面shell(Graphical User Interface shell 即 GUI shell)二:命令行式shell(Command Line Interface shell,即CLI shell)shell基本命令:1.安tab键可以补全命令2.sudo passwd root 可以改root密码3.su进入超级管理员界面

    时间:2018-11-02 关键词: shell Linux

  • VC++ 外壳扩展编程之windows右键菜单

    这次我想和大家一起讨论一下 Windows 的 Shell 扩展编程,首先在阅读以下内容之前我还是推荐大家看一下《COM技术内幕》这本大作,不过即使您没有有关的基础知识其实也是无所谓的,因为以下讲解是傻瓜式讲解。开发环境Windows Professional 2000Microsoft Visual C++ 6.0 + ATL3.0参考文献COM技术内幕ATL应用与开发指南(第二版)Windows外壳扩展    Windows外壳扩展的英文名称为:Windows Shell Extension。Windows外壳扩展是一类特殊的COM对象,在这类COM对象中用户可以加入自己的特殊功能,而Windows外壳扩展最终都会 被Windows Explorer所引用。举个最简单的例子,比如 WinRar 应用程序,如果你安装完 WinRar 后,它会在你的右键菜单中加入很多快捷菜单,如 图1.1 所示:图1.1而上图却仅仅是外壳扩展编程中一种:"Context Menu Handler"。难道外壳扩展也分类吗?是的,但是不多,并且它们的实现大都一致,总体来说有如下几种分类:表(一)处理器类型 何时触发 所做处理 Context menu 处理器 当用户鼠标右击文件或文件夹时触发。但是在Shell V4.71+中,用户在文件夹目录的空白处点击鼠标右键也会触发该事件。 加入上下文菜单项。 Property sheet 处理器 当用户鼠标右击文件,选择文件"属性"菜单弹出文件属性对话框时触发。 加入用户自定义属性页。 Drag and drop 处理器 当用户在文件夹或桌面中用鼠标右键Drag/Drop文件或文件夹时触发。 加入上下文菜单项。 Drop处理器 当某一数据对象被Drag Over/Dropped Into某一文件时触发。 加入任何用户自定义动作。 QueryInfo 处理器(Shell V4.71+) 当用户鼠标滑过某一个文件或某一Shell对象时触发。 加入用户自定义提示信息(ToolTips)。     也许有人会问我实现它们困难吗?答案是:比较简单。实现它是不是必须得去看那些枯燥乏味的ATL模板类,或者生硬死板的 MFC 宏定义呢?答案是否定的。也许以上的问题阻碍了大多数COM初学者的学习欲望,其实我刚接触ATL时多的是迷惘,常常抱怨 ATL 的知识太深奥,MFC的构架太生硬,一般我是不太喜欢用#define来定义程序的全部(请参阅 effective C++)。言归正传,我们再回到今天的话题上来,那么为实现 图1.1 所示功能可以通过哪些途径呢?答案有二,第一:注册表编程。第二:Shell Extension COM编程。通过注册表方式实现其实十分简单,请参阅 COM 组件注册表实现,在这里本文不做重复介绍,再者也不是本文的主题所在。在以下的内容中我会以第一类 Shell 扩展编程---" Context Menu 处理器" 为例来讲解 Handler 的实现过程。组件功能    该组件实现的功能为:当用户在Explorer中鼠标右击DLL类型文件时,在弹出的上下文菜单中注册我们自己的菜单项,如图1.2 所示:图1.2"Register Component"和"UnRegister Component"菜单项既是我们自己的菜单项。并且这两个菜单项分别完成进程内组件(DLL) 的注册和反注册,菜单项的功能倒很简单,只是简单地执行了 Windows 的 Regsvr32.exe而已,但是我们已经感觉到它给我们带来的实用和方便,难道你不觉得 "Over and Over" 手工输入 "Regsvr32 xxx.dll" 或者 "Regsvr32 /u xxx.dll" 很乏味吗……。编写组件  建立工程: 打开VC++,新建一个"ATL Com AppWizard"模板工程,工程名称为:SimpleExt。图 1.3Shell扩展实例均为进程内组件,它们均以动态库的形式存在,所以在接下来的向导中我们用默认设置:"Dynamic Link Library(DLL)",然后点击"完成"。如 下图所示:图 1.4此时我们已经拥有了一个没有实现任何功能的进程内 COM 组件,为什么说"没有实现任何功能"呢?那是因为我们没有实现任何接口,再者在我们的DLL中也没有任何可供外部使用的接口。    如果我们的组件不继承其他外部已有接口,那么这样的COM组件实现起来则非常简单,它和编写普通类代码没有任何不一样的地方,只需要使用 ATL 接口的 Method 和Property 增/删向导即可实现。    显然我们的组件要 继承 Shell 的扩展接口,并且还得实现所有继承的 Shell 接口,所以我们就不能完全依赖 ATL 的"自动化"了,这里需要我们自己写代码来实现该接口。首先我们通过 AT L向导新增一个简单接口 SimpleShlExt,如下图1.5,图1.6 和 图1.7 所示操作过程:图 1.5图 1.6图 1.7然后一切默认即可,这样ATL就为我们生成了一个组件框架,我们以下的讨论都基于此框架。2.添加代码图1.8 组件类继承关系图1.8 中红色方框是我们自己要实现的 Shell 扩展接口,它不是向导自动生成代码,需要我们手工输入。    我们从该框架中可以获得很多好处,首先通过 ATL 的模板类 CcomCoClass 我们就可以省去反复再三的 QueryInterface 接口的实现,而我们只需要绑定组件和接口的映射关系(如下图1.9 所示)以及实现所继承接口的全部虚函数即可,以及组件的注册等它基本上都为我们做好了一切,好处大家就慢慢体会吧......。下面我们首先介绍继承的各接口和其虚成员函数的作用,它们的声明包含在头文件中,首先头文件你必须包含进来:图1.9 建立组件和接口的映射关系图1.9 红色方框为 IShellExtInit 和 IContextMenu 接口和组件的接口映射关系,它不是向导自动生成代码,需要我们手工输入。IShellExtInit接口:IShellExtInit 接口为 Shell 扩展编程必须要实现的接口。该接口主要用来初始化 Shell 扩展处理器(表一所列的处理器),它仅有一个虚成员函数Initialize,用户所有的 Shell 扩展初始化动作都由该函数完成。该函数的原型如下: HRESULT Initialize(    LPCITEMIDLIST pidlFolder,LPDATAOBJECT lpdobj,HKEY hkeyProgID);     在 Initialize 函数中,我们要做的事情就是获取用户鼠标右键点击的文件名称,但是有可能用户选择了多个文件,这里为了简单起见我们仅获取文件列表中的第一个文件。在这里 我们得补充一点内容:当用户在一个拥有 WS_EX_ACCEPTFILES 风格的窗体中Drag/Drop 文件时这些文件名会以同一种格式存储,而且文件完整路径的获取也都以DragQueryFile API函数来实现。但是 DragQueryFile 需要传入一个 HDROP 句柄,该句柄即为 Drag/Drop 文件名称列表数据句柄(开始存放数据的内存区域首指针)。而 HDROP 句柄的可以通过接口 " DATAOBJECT lpdobj" 的成员函数" GetData" 来获取。以下为获取第一个 Drag/Drop 文件的完整文件路径的具体代码: //数据存储格式FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };//数据存储内存句柄(常用于IDataObject和IAdviseSink接口的数据传输操作)STGMEDIUM stg = { TYMED_HGLOBAL };if(FAILED(pDataObj->GetData(&fmt, &stg))){     //如果获取数据内存句柄失败则返回E_INVALIDARG,     //返回E_INVALIDARG则Explorer不会再调用我们的Shell扩展接口     return E_INVALIDARG;}//获取实际数据内存句柄HDROP hDrop = (HDROP)GlobalLock(stg.hGlobal);if(NULL==hDrop){     //在COM程序中养成良好的检错习惯是很重要的!!!     return E_INVALIDARG;}//获取用户Drag/Drop的文件数目int nDropCount = ::DragQueryFile((HDROP)stg.hGlobal, 0xFFFFFFFF, NULL, 0);//本示例程序仅获取第一个Drag/Drop文件完整路径//以下注释代码为获取所有文件完整路径的实现代码://for(int i = 0; i < nDropCount; ++i){     //循环获取每个Drag/Drop文件的完整文件名     // ::DragQueryFile((HDROP)stg.hGlobal, i, m_pzDropFile, MAX_PATH);//}//如果用户Drag/Drop的文件数目不为一个则不予处理if(1==nDropCount){     //pzDropFile为组件类内部的private变量     //它用来保存用户Drag/Drop的文件完整文件名     memset(m_pzDropFile, 0x0, MAX_PATH*sizeof(TCHAR));     ::DragQueryFile((HDROP)stg.hGlobal, 0, m_pzDropFile, MAX_PATH);}//释放内存句柄::ReleaseStgMedium(&mdmSTG); 至此 IShellExtInit 接口已经完全实现,从此我们也可以看出进程内组件编程的一些特点,大体总结如下:"新建自己的接口,然后继承某些接口,最后一一实现这些接口的所有虚成员函数或 加入自己的成员函数,最后就是组件的注册"。   IContextMenu 接口:该接口和 "Context Menu 处理器" 一一对应,说到此我们也顺便说一下 Shell 扩展接口编程中和(表一)中所列处理器各自对应的COM接口:(表二)处理器类型 COM接口 Context menu 处理器 IContextMenu Property sheet 处理器 IShellPropSheetExt Drag and drop 处理器 IContextMenu Drop 处理器 IDropTarget QueryInfo 处理器(Shell V4.71+) IQueryInfo 其中 "Drag and drop 处理器" 的除了 COM 接口 IContextMenu 实现外还得需要注册表的特殊注册才可以实现。其中 IContextMenu 接口有三个虚成员函数需要我们的组件来实现,其函数原型分别如下: HRESULT QueryContextMenu(    HMENU hmenu,    UINT indexMenu,    UINT idCmdFirst,    UINT idCmdLast,    UINT uFlags); 注:在QueryContextMenu 成员函数中我们可以加入自己的菜单项,插入菜单项其实很简单,我们可以通过 InsertMenu API 函数来实现,如下代码所示: ::InsertMenu(hmenu, indexMenu, MF_STRING | MF_BYPOSITION, idCmdFirst, IDM_REG_MNU_TXT); QueryContextMenu 的处理过程十分简单,在这里无须多说。 HRESULT GetCommandString(   UINT idCmd,   UINT uFlags,   UINT *pwReserved,    LPSTR pszName,    UINT cchMax); 注:GetCommandString 成员函数为 Explorer 提供了在状态栏显示菜单命令提示信息的方法。在这个方法中 "LPSTR pszName" 是我们要关注的参数,我们只要根据 "UINT uFlags" 参数来填充 "LPSTR pszName" 参数即可。在这里可能会涉及到 ANSI 和 UNICODE 之间相互转换的知识,不过在这里我要提醒大家的是:在 COM 编程中尽可能使用兼容的 TCHAR 类型,同时对字符操作也尽量不要使用 C 类的 和 等等函数库,因为这样会使您无法通过 "Win32 Release Mindependency " 或其他 UINCode/Release 版本的编译过程。 HRESULT InvokeCommand(    LPCMINVOKECOMMANDINFO pici); InvokeCommand 函数实现最终菜单项命令的执行。在 "LPCMINVOKECOMMANDINFO pici" 参数中包含了当前用户执行的菜单项ID和其他一些标志信息,如下代码可获取菜单项的ID: //如果 nFlag 不为0则说明 pici->lpVerb 指向一个以''''结尾的字符串int nFlag = HIWORD(pici->lpVerb);//用户当前点击的菜单项ID int nMnuId = LOWORD(lpici->lpVerb); 一旦获取了菜单项ID那么我们就可以根据不同的菜单项来执行相应的动作,如图1.2 所示的 "Register Component" 和 "UnRegister Component" 菜单项所对应的 "注册/反注册进程内组件" 动作。3.组件必要的宏定义部分其实这一步十分简单,本可以忽略,但是为了把过程讲的更清楚一点我还是列了出来: //声明组件注册所用的注册表REG资源//其中IDR_SIMPLESHLEXT为注册表资源IDDECLARE_REGISTRY_RESOURCEID(IDR_SIMPLESHLEXT)//AddRef和Release成员函数的实现DECLARE_PROTECT_FINAL_CONSTRUCT()//组件接口映射部分,该部分映射主要是告诉QueryInterface能返回哪些接口给外部BEGIN_COM_MAP(CSimpleShlExt)COM_INTERFACE_ENTRY(ISimpleShlExt)COM_INTERFACE_ENTRY(IDispatch)COM_INTERFACE_ENTRY(IShellExtInit) //IShellExtInit接口COM_INTERFACE_ENTRY(IContextMenu) //IContextMenu接口END_COM_MAP() 4.组件注册首先要在系统文件类型".DLL"下注册上下文菜单处理器创建注册表项HKCRdllfileShellExContextMenuHandlersSimpleShlExt,并设置其默认值为我们类的GUID值即可。设置访问许可权(适应于WinNT构架的操作系统)如果您不设置该选项则只有 Administrator 权限的用户才可以使用该 Shell 扩展在 HKCMSOFTWAREMicrosoftWindowsCurrentVersionShell ExtensionsApproved 注册表项下创建键值:键名为:类的 GUID键值为:有关类的描述信息(任意字符串,无特殊要求)。组件注册的程序内部实现DLL文件上下文菜单的实现通过 REG 注册表资源文件实现,描述层次结构如下: HKCR{    NoRemove dllfile   {      NoRemove ShellEx      {          NoRemove ContextMenuHandlers          {    //类的GUID字符串                       ForceRemove SimpleShlExt = s''{7C108295-19DE-4093-A9F8-ACC5E031E27A}''          }      }   }} 访问许可权的注册则在DllRegisterServer DLL输出函数中完成。其实现只需要使用注册表的Win32 API函数即可;相应的反注册组件时则应在  DllUnregisterServer中删除相应的注册表键值即可。

    时间:2018-10-30 关键词: vc++ 扩展编程 shell

首页  上一页  1 2 下一页 尾页
发布文章

技术子站