曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6312|回复: 2
打印 上一主题 下一主题

exec

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2008-12-30 02:12:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
exec命令可以用来替代当前shell;还句话说,并没有启动子 shell,使用这一命令时,任何现有环境将会被清除,并重新启动一个shell。

exec command

上面中的 command 通常是一个 shell 脚本。

而在对文件描述符进行操作的时候(也只有在这时),它不会覆盖你当前的 shell。

假设一开始用的是 root 登录;
然后,切换到 beyes 帐号,随便执行一个脚本,如下:
[beyes@localhost shell]$ exec ./salutation.sh
Hello
The program /home/beyes/shell/salutation.sh is now running
The second parameter was
The first parameter was
The parameter list was
The user's home directory is /home/beyes
Please enter a new greeting
hi
hi
The script is now complete
[root@localhost Desktop]#        //到这里,脚本执行完毕,返回到 root

脚本里执行 exec。设 exect 这个文件的内容为:
#!/bin/bash

exec echo "hello world"

echo "display?"

执行脚本后,可以看到只输出 hello world 后面的 display? 没有输出,说明执行了 exec 后,重新启动了一个新的 shell ,故后来的脚本内容没有得到执行。

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
沙发
 楼主| 发表于 2008-12-30 02:36:23 | 只看该作者

exec 与 文件描述符

文件描述符0:标准输入
文件描述符1:标准输出
文件描述符2:标准错误

文件描述符 3-9 可供用户使用。

示例一:
假设一个文本文件 name.txt 内容如下:
root
beyes
love
duoduo

脚本内容如下:
#!/bin/bash
#file_exec

exec 0<name.txt
read line1
read line2
read line3
read line4
read line5
read line6
read line7

echo $line1
echo $line2

echo $line3
echo $line4
echo $line5
echo $line6
echo $line7

执行脚本后输出如下:
[beyes@localhost shell]$ ./file_exec.sh
root
beyes
love
duoduo
在上面的脚本中,执行了 exec 0<name.txt 后,标准输入源重定向到 name.txt。当执行 read 语句时,从 name.txt 中读取内容到变量中;而当 name.txt 中的数据不能够填满所有的变量时,剩下的变量读入为空,于是在输出时是输出空行。



如果在脚本中重定向许多数据,那么重定向每个 echo 语句时就显得很不方便。这种情况下,可以使用 exec 通知 shell 在脚本执行期间重定向特定的文件描述符:

[Bash shell] 纯文本查看 复制代码
#!/bin/sh


exec 1>testout.txt


echo "test line 1"
echo "test line 2"
echo "test line 3"


运行后,echo 出的消息都被重定向到 testout.txt 文件中:
[root@centos shell]# cat testout.txt
test line 1
test line 2
test line 3

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
板凳
 楼主| 发表于 2008-12-30 12:52:29 | 只看该作者

exec 与 文件描述符示例二

脚本示例:
#!/bin/sh
exec 4<&0 0<name.txt
read line1
read line2
exec 0<&4
echo $line1
echo $line2

执行后输出:
[beyes@localhost shell]$ ./file_exec.sh
root
beyes

解释:
exec 4<&0 0< name.txt 执行了两个「动作」: 首先, 把文件描述符 0 (标准输入 stdin,一般指键盘) 复制 (duplicate) 到描述符 4 (效果上是把 0 做了个备份), 然后, 用描述符 0 打开 name.txt.这个时候 stdin 就从 name.txt 读数据了, 因此后面的 read 就是 name.txt.
--
exec 0<&4 把前面备份的描述符 4 复制回 0, 其实就是恢复了从键盘读数据

如果将上面的 exec 0<&4 换成 exec 0<&4- , 这不但恢复了 stdin, 而且还把临时使用的描述符 4 给 close 掉了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-17 16:34 , Processed in 0.079280 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表