当前位置:首页 » 操作系统 » linuxshell管道

linuxshell管道

发布时间: 2024-12-11 22:43:29

linux-shell基础(七)

Linux Shell 基础七:操作与脚本编写

常用编辑器包括 vim、nano、Emacs、Kwrite、Kate 及 GNOME,熟悉一种风格足以。了解其常用操作与命令是基础。

Shell 脚本精髓在于串联命令,同时处理其结果,甚至将一个命令的结果传递给另一个,实现一次性执行。

多个命令可以写在同一行,用分号隔开。但每次执行仍需手动输入。通过将命令放入文本文件,可批量执行。

使用 `echo` 命令,可显示脚本执行内容。

引入变量,包括环境变量和自定义变量(注意大小写区分)。通过 `$` 符号引用变量。

命令替换,将命令输出赋值给变量,可用 `()` 或者 `(``)` 实现。

输出重定向功能,将命令输出发送至文件。使用较为繁琐,有时可直接将命令传递给另一个命令,利用管道简化。

数学运算需借助 `expr` 命令,表现一般。浮点运算则推荐使用 `bc` 计算器。

优雅退出脚本,Shell 使用退出状态码反馈命令执行结果。正常终止的退出码为 0,错误终止则为正整数(最大 255)。通过 `exit` 命令可指定退出码。

实例演示,展示如何在 Shell 脚本中应用上述概念与技巧。

② Linux Shell

Linux Shell 是用户与操作系统交互的界面,它提供了多种命令供用户执行操作,本文将详细介绍一些常用命令。

1. 终端快捷键:在Linux Shell中,有一些快捷键能提高操作效率,例如Ctrl+A可以选中屏幕中的所有内容,Ctrl+C停止执行当前命令,Ctrl+D退出当前Shell。

2. 切换路径 cd:用户可以使用cd命令在不同的目录间切换,例如cd /root 进入root用户目录,cd .. 返回上一级目录。

3. 查看目录信息:使用ls命令查看当前目录下所有文件和目录的列表。使用ls -l列出文件的详细信息,包括文件权限、文件大小、创建日期等。

4. 创建文件夹:使用mkdir命令创建新的目录,例如mkdir newdir。

5. 新建文件:使用touch命令创建新文件,例如touch newfile。

6. 重定向:在Linux Shell中,可以使用>和>>符号将命令的输出重定向到文件,例如ls > output.txt。

7. 管道 |:管道命令将前一个命令的输出作为后一个命令的输入,实现数据流的传递,例如ls | grep .txt。

8. 文件操作:使用cat命令查看文件内容,使用more和less命令分页查看大文件。使用head和tail命令查看文件的开头和结尾。

9. 查看文件:使用less命令分页查看文件内容,使用more命令逐页查看文件内容。使用cat命令查看文件的全部内容。

10. 查找文本:使用grep命令在文件中查找指定文本,例如grep "Linux" file.txt。

11. 远程管理:使用ssh命令实现远程登录和文件传输,例如ssh user@host。

12. 组、用户和权限:使用groupadd命令创建新用户组,使用useradd命令创建新用户。使用chmod命令修改文件和目录权限,使用chown命令修改文件和目录所有者。

13. 系统信息:使用uname命令查看系统信息,例如uname -a查看系统详细信息。使用df命令查看磁盘使用情况。

14. 软链接:使用ln命令创建软链接,例如ln -s originalfile symlink。

15. 打包压缩:使用tar命令进行打包和压缩,例如tar -cvf archive.tar file1 file2。使用gzip命令进行压缩,例如gzip file。

16. 软件安装与卸载:使用apt-get命令进行软件包管理,例如sudo apt-get install software。使用dpkg命令安装和卸载软件包,例如sudo dpkg -i package.deb。

17. 其他:Linux Shell还提供了大量的其他命令供用户使用,例如find命令用于查找特定文件,rsync命令用于远程文件同步等。

③ linux shell中关于输入重定向的问题

重定向就是这样的,命令的结果只能输出到一个地方,了解原理就可以理解了。
在 IO Redirection 中,stdout 或 stderr 的管道总是会先准备好,然后才将命令执行结果给导入。
你给的例子中,先重定向到/111.txt,再重定向到/222.txt,因此管道最终是接入了/222.txt。stdout只有一根管道,输入端是固定的,你只是在不停地移动输出端,当然是以最后的为准啦。

建议你去看看《Shell十三问》,里面有关于 IO Redirection 的详细解释。

解决方法就是用 tee 命令:
ls -l | tee /111.txt > /222.txt

④ linux命令中的“<”和“|”是什么意思

”<” 表示的是输入重定向的意思,就是把<后面跟的文件取代键盘作为新的输入设备。
”| ”则表示一个管道的意思,可以理解为东西从管道的一边流向另外一边。

⑤ Linux进程间通信

linux下进程间通信的几种主要手段简介:

一般文件的I/O函数都可以用于管道,如close、read、write等等。

实例1:用于shell

管道可用于输入输出重定向,它将一个命令的输出直接定向到另一个命令的输入。比如,当在某个shell程序(Bourne shell或C shell等)键入who│wc -l后,相应shell程序将创建who以及wc两个进程和这两个进程间的管道。

实例二:用于具有亲缘关系的进程间通信

管道的主要局限性正体现在它的特点上:

有名管道的创建

小结:

管道常用于两个方面:(1)在shell中时常会用到管道(作为输入输入的重定向),在这种应用方式下,管道的创建对于用户来说是透明的;(2)用于具有亲缘关系的进程间通信,用户自己创建管道,并完成读写操作。

FIFO可以说是管道的推广,克服了管道无名字的限制,使得无亲缘关系的进程同样可以采用先进先出的通信机制进行通信。

管道和FIFO的数据是字节流,应用程序之间必须事先确定特定的传输"协议",采用传播具有特定意义的消息。

要灵活应用管道及FIFO,理解它们的读写规则是关键。

信号生命周期

信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。

可以从两个不同的分类角度对信号进行分类:(1)可靠性方面:可靠信号与不可靠信号;(2)与时间的关系上:实时信号与非实时信号。

(1) 可靠信号与不可靠信号

不可靠信号 :Linux下的不可靠信号问题主要指的是信号可能丢失。

可靠信号 :信号值位于SIGRTMIN和SIGRTMAX之间的信号都是可靠信号,可靠信号克服了信号可能丢失的问题。Linux在支持新版本的信号安装函数sigation()以及信号发送函数sigqueue()的同时,仍然支持早期的signal()信号安装函数,支持信号发送函数kill()。

对于目前linux的两个信号安装函数:signal()及sigaction()来说,它们都不能把SIGRTMIN以前的信号变成可靠信号(都不支持排队,仍有可能丢失,仍然是不可靠信号),而且对SIGRTMIN以后的信号都支持排队。这两个函数的最大区别在于,经过sigaction安装的信号都能传递信息给信号处理函数(对所有信号这一点都成立),而经过signal安装的信号却不能向信号处理函数传递信息。对于信号发送函数来说也是一样的。

(2) 实时信号与非实时信号

前32种信号已经有了预定义值,每个信号有了确定的用途及含义,并且每种信号都有各自的缺省动作。如按键盘的CTRL ^C时,会产生SIGINT信号,对该信号的默认反应就是进程终止。后32个信号表示实时信号,等同于前面阐述的可靠信号。这保证了发送的多个实时信号都被接收。实时信号是POSIX标准的一部分,可用于应用进程。非实时信号都不支持排队,都是不可靠信号;实时信号都支持排队,都是可靠信号。

发送信号的主要函数有:kill()、raise()、 sigqueue()、alarm()、setitimer()以及abort()。

调用成功返回 0;否则,返回 -1。

sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然也支持前32种),支持信号带有参数,与函数sigaction()配合使用。

sigqueue的第一个参数是指定接收信号的进程ID,第二个参数确定即将发送的信号,第三个参数是一个联合数据结构union sigval,指定了信号传递的参数,即通常所说的4字节值。

sigqueue()比kill()传递了更多的附加信息,但sigqueue()只能向一个进程发送信号。sigqueue()比kill()传递了更多的附加信息,但sigqueue()只能向一个进程发送信号。

inux主要有两个函数实现信号的安装: signal() sigaction() 。其中signal()在可靠信号系统调用的基础上实现, 是库函数。它只有两个参数,不支持信号传递信息,主要是用于前32种非实时信号的安装;而sigaction()是较新的函数(由两个系统调用实现:sys_signal以及sys_rt_sigaction),有三个参数,支持信号传递信息,主要用来与 sigqueue() 系统调用配合使用,当然,sigaction()同样支持非实时信号的安装。sigaction()优于signal()主要体现在支持信号带有参数。

消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。消息队列是随内核持续的

消息队列的内核持续性要求每个消息队列都在系统范围内对应唯一的键值,所以,要获得一个消息队列的描述字,只需提供该消息队列的键值即可;

消息队列与管道以及有名管道相比,具有更大的灵活性,首先,它提供有格式字节流,有利于减少开发人员的工作量;其次,消息具有类型,在实际应用中,可作为优先级使用。这两点是管道以及有名管道所不能比的。同样,消息队列可以在几个进程间复用,而不管这几个进程是否具有亲缘关系,这一点与有名管道很相似;但消息队列是随内核持续的,与有名管道(随进程持续)相比,生命力更强,应用空间更大。

信号灯与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制。相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志。除了用于访问控制外,还可用于进程同步。信号灯有以下两种类型:

int semop(int semid, struct sembuf *sops, unsigned nsops); semid是信号灯集ID,sops指向数组的每一个sembuf结构都刻画一个在特定信号灯上的操作。

int semctl(int semid,int semnum,int cmd,union semun arg)
该系统调用实现对信号灯的各种控制操作,参数semid指定信号灯集,参数cmd指定具体的操作类型;参数semnum指定对哪个信号灯操作,只对几个特殊的cmd操作有意义;arg用于设置或返回信号灯信息。

进程间需要共享的数据被放在一个叫做IPC共享内存区域的地方,所有需要访问该共享区域的进程都要把该共享区域映射到本进程的地址空间中去。系统V共享内存通过shmget获得或创建一个IPC共享内存区域,并返回相应的标识符。内核在保证shmget获得或创建一个共享内存区,初始化该共享内存区相应的shmid_kernel结构注同时,还将在特殊文件系统shm中,创建并打开一个同名文件,并在内存中建立起该文件的相应dentry及inode结构,新打开的文件不属于任何一个进程(任何进程都可以访问该共享内存区)。所有这一切都是系统调用shmget完成的。

shmget()用来获得共享内存区域的ID,如果不存在指定的共享区域就创建相应的区域。shmat()把共享内存区域映射到调用进程的地址空间中去,这样,进程就可以方便地对共享区域进行访问操作。shmdt()调用用来解除进程对共享内存区域的映射。shmctl实现对共享内存区域的控制操作。这里我们不对这些系统调用作具体的介绍,读者可参考相应的手册页面,后面的范例中将给出它们的调用方法。

注:shmget的内部实现包含了许多重要的系统V共享内存机制;shmat在把共享内存区域映射到进程空间时,并不真正改变进程的页表。当进程第一次访问内存映射区域访问时,会因为没有物理页表的分配而导致一个缺页异常,然后内核再根据相应的存储管理机制为共享内存映射区域分配相应的页表。

热点内容
战矛在线手游怎么选服务器 发布:2024-12-12 06:13:40 浏览:366
有什么办法可以打开密码挂锁 发布:2024-12-12 06:12:55 浏览:948
数据反编译 发布:2024-12-12 06:11:24 浏览:913
苹果电脑appleid服务器连接时出错 发布:2024-12-12 06:09:17 浏览:585
有了服务器域名怎么用自己的模板 发布:2024-12-12 06:08:33 浏览:785
android监听键盘按键 发布:2024-12-12 06:06:20 浏览:457
创建虚拟机linux 发布:2024-12-12 06:00:48 浏览:590
如何删除明细配置 发布:2024-12-12 05:55:10 浏览:759
bp反向传播算法 发布:2024-12-12 05:52:13 浏览:405
android结构图 发布:2024-12-12 05:37:44 浏览:496