2012-07-16 29 views
0

我想从Perl中执行以下UNIX命令转义序列Perl的Unix命令

`git log --pretty=format:%H | grep $id | wc -l`; 

我不断收到一个错误说

sh: -c : syntax error near unexpected token '|' 
sh -c : '| wc -l' 

我怎样才能解决这个错误

+5

你有Perl。你为什么使用'grep'和'wc'? – 2012-07-16 18:38:33

+0

因为我正在使用它来执行终端上的外部命令 – iDev 2012-07-16 18:39:43

+0

重复问题不是答案。 – ikegami 2012-07-16 18:51:05

回答

5

的问题是,你有123<NEWLINE>而不是123$id,所以你通过以下的外壳:中

git log --pretty=format:%H | grep 123 
| wc -l 

代替

git log --pretty=format:%H | grep 123 | wc -l 

$id修正值。最好的方法可能是通过chomp

+0

是的,这是正确的。我在$ id中得到一个字母数字值。但看到我认为的错误,我错过了转义序列可能是 – iDev 2012-07-16 18:54:35

+1

你错过了这一点。我说你在'$ id'中没有字母数字值。再次阅读。也许稍微更清楚一点,我做了一点改动。 – ikegami 2012-07-16 18:55:47

+0

谢谢,这有助于:) – iDev 2012-07-16 19:01:13

1

如果您使用Perl子例程而不是外部Unix命令来实现某些功能,那么您可能会拥有更健壮的脚本。

使用反向引用对于快速脚本来说是好的,但它本质上是脆弱的,因为您暴露于运行脚本的用户配置的任何Unix shell的全部力量和奇怪之处(使用通配符扩展,输入/输出重定向,管道等)。这确实适用于任何编程语言,并且大多数语言(包括perl)都有更安全的方式来运行外部命令而不使用shell。但Perl创建的原因之一就是能够在一种编程语言下将Unix命令的文本处理能力结合起来。

+0

$ id ='git rev-parse $ _〜0'; – iDev 2012-07-16 18:42:55

+0

可能是一个引用问题,那么。您可能想要打印正在生成的字符串,以确切地查看它传递给shell的内容。我在上面指定的变量内容中看到了几个特殊字符。 – theglauber 2012-07-16 18:46:03

+0

我试着在终端上打印进行调试。它看起来很好。但是,当我猜测它是逃避管道的问题时。 – iDev 2012-07-16 18:48:33