我想从Perl中执行以下UNIX命令转义序列Perl的Unix命令
`git log --pretty=format:%H | grep $id | wc -l`;
我不断收到一个错误说
sh: -c : syntax error near unexpected token '|'
sh -c : '| wc -l'
我怎样才能解决这个错误
我想从Perl中执行以下UNIX命令转义序列Perl的Unix命令
`git log --pretty=format:%H | grep $id | wc -l`;
我不断收到一个错误说
sh: -c : syntax error near unexpected token '|'
sh -c : '| wc -l'
我怎样才能解决这个错误
的问题是,你有123<NEWLINE>
而不是123
在$id
,所以你通过以下的外壳:中
git log --pretty=format:%H | grep 123
| wc -l
代替
git log --pretty=format:%H | grep 123 | wc -l
在$id
修正值。最好的方法可能是通过chomp
。
如果您使用Perl子例程而不是外部Unix命令来实现某些功能,那么您可能会拥有更健壮的脚本。
使用反向引用对于快速脚本来说是好的,但它本质上是脆弱的,因为您暴露于运行脚本的用户配置的任何Unix shell的全部力量和奇怪之处(使用通配符扩展,输入/输出重定向,管道等)。这确实适用于任何编程语言,并且大多数语言(包括perl)都有更安全的方式来运行外部命令而不使用shell。但Perl创建的原因之一就是能够在一种编程语言下将Unix命令的文本处理能力结合起来。
$ id ='git rev-parse $ _〜0'; – iDev 2012-07-16 18:42:55
可能是一个引用问题,那么。您可能想要打印正在生成的字符串,以确切地查看它传递给shell的内容。我在上面指定的变量内容中看到了几个特殊字符。 – theglauber 2012-07-16 18:46:03
我试着在终端上打印进行调试。它看起来很好。但是,当我猜测它是逃避管道的问题时。 – iDev 2012-07-16 18:48:33
你有Perl。你为什么使用'grep'和'wc'? – 2012-07-16 18:38:33
因为我正在使用它来执行终端上的外部命令 – iDev 2012-07-16 18:39:43
重复问题不是答案。 – ikegami 2012-07-16 18:51:05