免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4142 | 回复: 6
打印 上一主题 下一主题

[系统管理] exec和变量的问题 [复制链接]

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-10 16:56 |只看该作者 |倒序浏览
很早就想问这个问题,后来忘记了,终于在今天想起来了。

exec 后用数字就可以:
  1. file_name="tmp.fifo"
  2. mkfifo $file_name
  3. exec 4<>${file_name}
  4. rm -rf $file_name
复制代码
用变量变不行:
  1. fd=4 # declare -r fd=4 也不行
  2. file_name="tmp.fifo"
  3. mkfifo $file_name
  4. exec $fd<>${file_name}
  5. rm -rf $file_name
复制代码
错误提示:
  1. ./test.sh: line 4: exec: 4: not found
复制代码

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
2 [报告]
发表于 2012-08-10 16:59 |只看该作者
为什么不能用变量呢?除了用 eval 的办法,有其它方案没?
  1. declare -r fd=4
  2. file_name="tmp.fifo"
  3. mkfifo $file_name
  4. eval "exec $fd<>${file_name}"
  5. rm -rf $file_name
复制代码

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
3 [报告]
发表于 2012-08-11 15:13 |只看该作者
fd=4 # declare -r fd=4 也不行
file_name="tmp.fifo"
mkfifo $file_name
exec $fd<>${file_name}

相当于
exec 4   0<>${file_name}

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
4 [报告]
发表于 2012-08-11 23:04 |只看该作者
waker 发表于 2012-08-11 15:13
fd=4 # declare -r fd=4 也不行
file_name="tmp.fifo"
mkfifo $file_name


是这样啊,这样的话,错误提示:exec: 4: not found 这个就能够解释了,能解释为什么会相当于 exec 4  0<>${file_name} 吗?

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
5 [报告]
发表于 2012-08-13 08:51 |只看该作者
回复 4# seesea2517

  1. 3.7.1 Simple Command Expansion

  2. When a simple command is executed, the shell performs the following expansions, assignments, and redirections, from left to right.

  3.     The words that the parser has marked as variable assignments (those preceding the command name) and redirections are saved for later processing.
  4.     The words that are not variable assignments or redirections are expanded (see Shell Expansions). If any words remain after expansion, the first word is taken to be the name of the command and the remaining words are the arguments.
  5.     Redirections are performed as described above (see Redirections).
  6.     The text after the ‘=’ in each variable assignment undergoes tilde expansion, parameter expansion, command substitution, arithmetic expansion, and quote removal before being assigned to the variable.
复制代码
variable assignments 和 redirections的处理和其它部分是不一样的

xx=oo或 xx>oo的含义是由xx =/> oo三个部分共同确定的,这就是上下文

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
6 [报告]
发表于 2012-08-13 18:02 |只看该作者
waker 发表于 2012-08-13 08:51
回复 4# seesea2517 variable assignments 和 redirections的处理和其它部分是不一样的

xx=oo或 xx>oo的 ...


谢谢,这段英文好好理解一下,虽然都查清楚每个词语的意思了,可还是觉得囫囵。有空再找完整的命令扩展内容读一读。

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
7 [报告]
发表于 2012-08-16 18:11 |只看该作者
waker 发表于 2012-08-11 15:13
fd=4 # declare -r fd=4 也不行
file_name="tmp.fifo"
mkfifo $file_name



看了一遍命令行处理介绍有点明白了:
exec $fd<>${file_name}

1. 打散到几个部分 exec 和 $fd 和 ${file_name}
2. 重定向先抓走备用,此时还没有做变量扩展,$fd 不是数字,所以 <>${file_name} 没有把 $fd 抓到一起做为重定向,于是省略了数字的话,相当于 0<>${file_name}
3. ……一些步骤
4. 变量扩展 exec $fd -> exec 4
……
报错:exec 4,4 不存在




刚巧论坛有同学发了链接,真是来的早不如来的巧,不然我可没心情去啃字母~
http://content.hccfl.edu/pollock/ShScript/CmdLineProcessing.htm
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP