免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2385 | 回复: 14

[系统管理] 为什么用eval可以正常执行的命令,用`却无法正确执行? [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
发表于 2016-11-23 04:40 |显示全部楼层
本帖最后由 bikkuri 于 2016-11-23 05:15 编辑

大家好!
我有一个问题向大家请教。
请看以下这些命令的执行结果:
[root@hp8:~]# cat t
if [ $(ls -l|grep -c t) -eq 0 ];then echo NO;else echo YES;fi
[root@hp8:~]# if [ $(ls -l|grep -c t) -eq 0 ];then echo NO;else echo YES;fi
YES
[root@hp8:~]# eval $(cat t)
YES
[root@hp8:~]# `cat t`
-bash: if: command not found
[root@hp8:~]#

请问为什么用eval可以正常执行这条命令,用backtick反引号`却无法正确执行?
假如换一条简单的不含有if的命令,比如date,用`是可以正确执行的,比如:
[box@iZ94mso98zxZ:~]$ cat d
date
[box@iZ94mso98zxZ:~]$ `cat d`
Wed Nov 23 04:55:40 CST 2016
[box@iZ94mso98zxZ:~]$

那么为什么用`无法执行if语句呢?
[box@iZ94mso98zxZ:~]$ `$(cat t)`
-bash: if: command not found
[box@iZ94mso98zxZ:~]$ `cat t`
-bash: if: command not found
[box@iZ94mso98zxZ:~]$ cat t
if [ $(ls -l|grep -c t) -eq 0 ];then echo NO;else echo YES;fi
[box@iZ94mso98zxZ:~]$ $(cat t)
-bash: if: command not found
[box@iZ94mso98zxZ:~]$ eval $(cat t)
YES
[box@iZ94mso98zxZ:~]$ eval `cat t`
YES
[box@iZ94mso98zxZ:~]$ ``cat t``
if [ $(ls -l|grep -c t) -eq 0 ];then echo NO;else echo YES;fi
[box@iZ94mso98zxZ:~]$ ```cat t```
-bash: if: command not found
[box@iZ94mso98zxZ:~]$
如果不用eval只用`应该如何正确执行这个命令呢?
[box@iZ94mso98zxZ:~]$ touch $(if [ $(ls -l|grep -c t) -eq 0 ];then echo NO;else echo YES;fi).txt
[box@iZ94mso98zxZ:~]$ ls -l *.txt
-rw-rw-r-- 1 box box    0 Nov 23 05:08 YES.txt
[box@iZ94mso98zxZ:~]$ rm -f YES.txt
[box@iZ94mso98zxZ:~]$ touch `if [ $(ls -l|grep -c t) -eq 0 ];then echo NO;else echo YES;fi`.txt
[box@iZ94mso98zxZ:~]$ ls -l *.txt
-rw-rw-r-- 1 box box    0 Nov 23 05:09 YES.txt
[box@iZ94mso98zxZ:~]$ rm -f YES.txt
[box@iZ94mso98zxZ:~]$ touch $(eval $(cat t)).txt
[box@iZ94mso98zxZ:~]$ ls -l *.txt
-rw-rw-r-- 1 box box    0 Nov 23 05:10 YES.txt
[box@iZ94mso98zxZ:~]$ rm -f YES.txt
[box@iZ94mso98zxZ:~]$ touch `$(cat t)`.txt
-bash: if: command not found
[box@iZ94mso98zxZ:~]$
谢谢大家!



base64.png

论坛徽章:
1
15-16赛季CBA联赛之江苏
日期:2016-10-26 16:19:04
发表于 2016-11-23 11:36 |显示全部楼层
`cat t`  = $(cat t),eval $(cat t) = eval `cat t`

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
发表于 2016-11-23 11:45 |显示全部楼层
`cat t` == 将文件t内容做为一条命令执行
eval `cat t` == 先执行cat t,再将执行结果做为命令执行

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
发表于 2016-11-23 16:36 |显示全部楼层
chengchow 发表于 2016-11-23 11:45
`cat t` == 将文件t内容做为一条命令执行
eval `cat t` == 先执行cat t,再将执行结果做为命令执行

现在的问题是为什么用`cat t`可以执行象date这样的命令,却不能执行if [ $(ls -l|grep -c t) -eq 0 ];then echo NO;else echo YES;fi这种含有if的命令?

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
发表于 2016-11-23 16:46 |显示全部楼层
即使没有if,有分号;也不行。
[box@iZ94mso98zxZ:~]$ cat t
date;
[box@iZ94mso98zxZ:~]$ echo `date;`
Wed Nov 23 16:44:53 CST 2016
[box@iZ94mso98zxZ:~]$ cat t
date;
[box@iZ94mso98zxZ:~]$ `cat t`
-bash: date;: command not found
[box@iZ94mso98zxZ:~]$ eval $(cat t)
Wed Nov 23 16:45:06 CST 2016
[box@iZ94mso98zxZ:~]$
为什么eval可以正确执行,而`不行呢?
有哪位高手能帮忙解释一下?????

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
发表于 2016-11-23 17:00 |显示全部楼层
看来是加了分号;后,cat t的结果会被加上一对引号
[box@iZ94mso98zxZ:~]$ cat t
date;
[box@iZ94mso98zxZ:~]$ cat d
date
[box@iZ94mso98zxZ:~]$ set -x
++ printf '\033]0;%s@%s:%s\007' box iZ94mso98zxZ '~'
[box@iZ94mso98zxZ:~]$ `cat t`
++ cat t
+ 'date;'
-bash: date;: command not found
++ printf '\033]0;%s@%s:%s\007' box iZ94mso98zxZ '~'
[box@iZ94mso98zxZ:~]$ `cat d`
++ cat d
+ date
Wed Nov 23 16:57:06 CST 2016
++ printf '\033]0;%s@%s:%s\007' box iZ94mso98zxZ '~'
[box@iZ94mso98zxZ:~]$ eval $(cat t)
++ cat t
+ eval 'date;'
++ date
Wed Nov 23 16:57:24 CST 2016
++ printf '\033]0;%s@%s:%s\007' box iZ94mso98zxZ '~'
[box@iZ94mso98zxZ:~]$ eval $(cat d)
++ cat d
+ eval date
++ date
Wed Nov 23 16:57:27 CST 2016
++ printf '\033]0;%s@%s:%s\007' box iZ94mso98zxZ '~'
[box@iZ94mso98zxZ:~]$ set +x
+ set +x
[box@iZ94mso98zxZ:~]$ 'date'
Wed Nov 23 16:58:08 CST 2016
[box@iZ94mso98zxZ:~]$ 'date;'
-bash: date;: command not found
[box@iZ94mso98zxZ:~]$
还是搞不懂为什么eval就是可以而`就是不行。。。。。。

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
发表于 2016-11-25 08:42 |显示全部楼层
没有人能回答一下我的问题吗???

论坛徽章:
0
发表于 2016-11-25 09:30 |显示全部楼层
回复 7# bikkuri
  1. [root@hp8:~]# cat t
  2. if [ $(ls -l|grep -c t) -eq 0 ];then echo NO;else echo YES;fi
  3. [root@hp8:~]# if [ $(ls -l|grep -c t) -eq 0 ];then echo NO;else echo YES;fi
  4. YES
  5. [root@hp8:~]# eval $(cat t)
  6. YES
  7. [root@hp8:~]# `cat t`
  8. -bash: if: command not found
  9. [root@hp8:~]#
复制代码
man eval就可以找到答案了。
eval的作用是将所给的命令解析两次。``与$()一样,只是执行命令。

你的t相当于一个变量,值是“if [ $(ls -l|grep -c t) -eq 0 ];then echo NO;else echo YES;fi”。
``(或$())时,整个命令是cat t --> cat if [ $(ls -l|grep -c t) -eq 0 ];then echo NO;else echo YES;fi --> 这条命令当然执行不了。
eval cat t --> cat t的值(因为eval先把t的变量,也这就是“if [ $(ls -l|grep -c t) -eq 0 ];then echo NO;else echo YES”这条命令执行了,得到t的值)-- 这样当然可以执行。





论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
发表于 2016-11-25 10:11 |显示全部楼层
重楼君 发表于 2016-11-25 09:30
回复 7# bikkuri man eval就可以找到答案了。
eval的作用是将所给的命令解析两次。``与$()一样,只是执行 ...

你理解错了,t是一个文件,文件的内容是if [ $(ls -l|grep -c t) -eq 0 ];then echo NO;else echo YES;fi

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
发表于 2016-11-25 10:17 |显示全部楼层
请回答一个简单的问题吧。
[box@iZ94mso98zxZ:~]$ `echo "date;"`
-bash: date;: command not found
[box@iZ94mso98zxZ:~]$ `echo "date"`
Fri Nov 25 10:15:04 CST 2016
[box@iZ94mso98zxZ:~]$
为什么有分号就出错?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP