Chinaunix

标题: 问个echo的问题(已解决) [打印本页]

作者: li2002    时间: 2005-04-02 16:28
标题: 问个echo的问题(已解决)
一直在看以前的精华贴,有个帖子中提到:

echo -e `cat _xxx2`这里的echo执行的是bash的buildin的echo函数,没有对应的echo.exe,source-code 在bash-src

cat _xxx2|xargs echo -e
这里面的echo执行的是一个echo.exe xargs通过 fork一个进程来执行这个外部命令的exe,source code 在sh-utils

我知道buildin优先于外部命令,为什么第二条命令却用外部命令,这是由xargs决定的吗?xargs的工作原理不就是拼装好命令依次执行其命令吗?
作者: aerofox    时间: 2005-04-02 20:14
标题: 问个echo的问题(已解决)
差不多。第一条单独的echo是用的内部(built-in)命令,第二种情况下是调用的外部命令,但不是叫echo.exe。在unix中,一个文件是否可执行不是靠扩展名来判断的,是靠文件权限来决定的。而且如果一个文件可执行,则执行时必须用文件的全名(包括扩展名)。这一点不同于DOS。
为什么xargs使用外部命令echo而不是内部命令echo,是因为内部命令echo的“内部”是相当于shell的,它是特定的shell所私有的,xargs不能跨过shell去调用shell的内部命令。如果一定要用,则应该是:
cat _xxx2|xargs sh -c "echo -e"
作者: li2002    时间: 2005-04-02 20:19
标题: 问个echo的问题(已解决)
tks
cat _xxx2|xargs sh -c "echo -e"
怎么看不对结果??
作者: aerofox    时间: 2005-04-02 20:55
标题: 问个echo的问题(已解决)
错了,是会看不到结果。xargs把cat命令输出的内容话到了"echo -e"后面,没有放到echo命令中,所以不行。要放到"echo -e"命令中,可能要用到xargs的-I(也许,记不清了),开关和{}参数,我行上UNIX试试才能确定。
作者: li2002    时间: 2005-04-02 21:32
标题: 问个echo的问题(已解决)
知道了,{}在我的redhat linux里是-i参数
cat w|xargs -i{} sh -c "echo -e '{}'"

之前我没在{}上加‘’,造成读文件中内容当成是要执行命令,显示出错信息,以为是其他地方写错的了。
作者: li2002    时间: 2005-04-02 21:50
标题: 问个echo的问题(已解决)
不过问题来了
我问这个问题原来是在精华贴中的一篇文章
原贴


  1. $ cat _xxx2
  2. "\xC4\xE3\xBA\xC3"
  3. $ echo -e `cat _xxx2`
  4. "你好"
  5. $ cat _xxx2|xargs echo -e
  6. \xC4\xE3\xBA\xC3

  7. 那位解答一下?

  8. 终于把问题搞清楚了:这里面有几个关键点:
  9. echo -e `cat _xxx2`这里的echo执行的是bash的buildin的echo函数,没有对应的echo.exe,source-code 在bash-src

  10. cat _xxx2|xargs echo -e
  11. 这里面的echo执行的是一个echo.exe xargs通过 fork一个进程来执行这个外部命令的exe,source code 在sh-utils

  12. 而两个echo的实现不同,bash的buildin是可以支持出这种\x转义符号
  13. sh-utils的echo.exe不支持这种转义
复制代码


按照aerofox 兄的说法如要在xargs中用sh的buildin的echo,必须


  1. cat w|xargs -i{} sh -c "echo -e  \"{}\""
复制代码


试验了一下,这次确实是用了buildin的echo,但用原贴的例子,得到的结果仍然是

  1. \xC4\xE3\xBA\xC3
复制代码

按照buildin的echo应该支持转义符号而输出

  1. 你好
复制代码

这里为什么又不支持了???

aerofox 帮我看看,谢谢!
作者: aerofox    时间: 2005-04-03 17:23
标题: 问个echo的问题(已解决)
这个我就不清楚了,我还没用过带中文的UNIX/LINUX,没接触过bash,我所用过的echo也都不带-e参数,还不敢乱说~~
请大侠们指招吧~~
作者: 寂寞烈火    时间: 2005-04-03 17:51
标题: 问个echo的问题(已解决)
/home/lee#echo $0
bash
/home/lee#echo -e "\xC4\xE3\xBA\xC3"
你好
/home/lee#exit
/home/lee#echo $0
-ksh
/home/lee#echo -e "\xC4\xE3\xBA\xC3"
\xC4\xE3\xBA\xC3

作者: li2002    时间: 2005-04-03 20:57
标题: 问个echo的问题(已解决)
奇怪!
如果w文件内容是
"\xC4\xE3\xBA\xC3"

那么cat w|xargs -i{} sh -c "echo -e  \"{}\""
结果就是
你好
注意没有引号,不是显示
"你好"
上面命令行用单引号一样的效果。

要是我把命令行中的引号去掉
cat w|xargs -i{} sh -c "echo -e  {}"
这样就会显示
xC4xE3xBAxC3

结果也没有引号。

而如果w文件没有引号就不行,我试验想把这两个引号加在命令行中怎么组合都不行,还是显示原来字串,难道又是引号的问题??

没弄明白这里引号被shell解释了几次,怎样才能文件中无引号时能显示出汉字来??
作者: li2002    时间: 2005-04-04 15:01
标题: 问个echo的问题(已解决)
up一下
作者: li2002    时间: 2005-04-07 15:42
标题: 问个echo的问题(已解决)
再up!
作者: guangzongy    时间: 2005-04-07 17:35
标题: 问个echo的问题(已解决)

  1. [kennyyu@haha shellTest]$ echo -e "\xC4\xE3\xBA\xC3"
  2. 你好
  3. [kennyyu@haha shellTest]$ echo -e '\xC4\xE3\xBA\xC3'
  4. 你好
  5. [kennyyu@haha shellTest]$ echo -e \\xC4\\xE3\\xBA\\xC3
  6. 你好
复制代码


没有被"或者'所屏蔽,或用\进行转义的\(eg. \\xC4)首先会在shell中进行一次转义处理,被shell的转义,
  1. echo -e \xC4\xE3\xBA\xC3
复制代码

已经成了:
  1. echo -e xC4xE3xBAxC3
复制代码

注意:此时尽管echo 带了-e参数,但是后面已经不是\000的东西了。
因此,
echo -e \xC4\xE3\xBA\xC3 得到的结果为xC4xE3xBAxC3就可以理解了
作者: li2002    时间: 2005-04-07 19:40
标题: 问个echo的问题(已解决)
这我明白
我是不明白这个
原贴
代码:


$ cat _xxx2
"\xC4\xE3\xBA\xC3"
$ echo -e `cat _xxx2`
"你好"
$ cat _xxx2|xargs echo -e
\xC4\xE3\xBA\xC3

那位解答一下?

终于把问题搞清楚了:这里面有几个关键点:
echo -e `cat _xxx2`这里的echo执行的是bash的buildin的echo函数,没有对应的echo.exe,source-code 在bash-src

cat _xxx2|xargs echo -e
这里面的echo执行的是一个echo.exe xargs通过 fork一个进程来执行这个外部命令的exe,source code 在sh-utils

而两个echo的实现不同,bash的buildin是可以支持出这种\x转义符号
sh-utils的echo.exe不支持这种转义



按照aerofox 兄的说法如要在xargs中用sh的buildin的echo,必须

代码:

cat w|xargs -i{} sh -c "echo -e  \"{}\""



试验了一下,这次确实是用了buildin的echo,但用原贴的例子,得到的结果仍然是
代码:

\xC4\xE3\xBA\xC3


按照buildin的echo应该支持转义符号而输出
代码:

你好


这里为什么又不支持了???
作者: r2007    时间: 2005-04-07 22:32
标题: 问个echo的问题(已解决)
try
  1. cat w|xargs -0i{} sh -c "echo -e  \"{}\""
复制代码

xargs会首先按照自己的方式转义的,参数-0可以禁止这个功能,有兴趣可以仔细看一下man xargs中的说明。
作者: li2002    时间: 2005-04-08 08:35
标题: 问个echo的问题(已解决)
谢谢r2007!果然行了。
cat w
"\xC4\xE3\xBA\xC3"
cat w|xargs   -0 -i{} sh -c "echo -e  '{}'"
"你好"

结果和直接echo一样。
作者: guangzongy    时间: 2005-04-08 09:17
标题: 问个echo的问题(已解决)
老大就是老大!!
作者: ivhb    时间: 2005-04-08 09:26
标题: 问个echo的问题(已解决)


  1. $ cat _xxx2
  2. "\xC4\xE3\xBA\xC3"
  3. $ echo -e `cat _xxx2`
  4. "你好"
  5. $ cat _xxx2|xargs echo -e  //??????对于xargs,这个可以么?换个cat_xxx2 | xargs -i echo -e {}试试看?
  6. \xC4\xE3\xBA\xC3

  7. 那位解答一下?

  8. 终于把问题搞清楚了:这里面有几个关键点:
  9. echo -e `cat _xxx2`这里的echo执行的是bash的buildin的echo函数,没有对应的echo.exe,source-code 在bash-src

  10. cat _xxx2|xargs echo -e
  11. 这里面的echo执行的是一个echo.exe xargs通过 fork一个进程来执行这个外部命令的exe,source code 在sh-utils

  12. 而两个echo的实现不同,bash的buildin是可以支持出这种\x转义符号
  13. sh-utils的echo.exe不支持这种转义
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2