2013-09-27 260 views
0

我对shell脚本不太了解。我想修改一个脚本,但它给了我错误“没有这样的文件或目录”我改变它之后。命令从命令行运行,但不能从shell脚本运行

但是该命令在命令提示符下工作。

这是引起问题的线。 (甚至不知道如何以下命令生成一个进程。)如果我运行命令

$valgrind ---tool=memcheck --trace-children=yes command 

任何想法

_T_COMMAND_=1 "valgrind ---tool=memcheck --trace-children=yes command" 

同样事情的作品?

+0

要执行命令,您需要执行'var = $(command)'。因此,你需要'_T_COMMAND _ = $(valgrind --- tool = memcheck -trace-children = yes命令)' – fedorqui

+0

,但它正在使用_T_COMMAND_ = 1“命令”。我已修改为_T_COMMAND_ = 1“valgrind ---工具= memcheck -trace-children = yes命令” – Sach

+1

调整脚本更改...修正了cpp代码更改的问题,并将valgrind添加到特定的子进程中! – Sach

回答

2

请勿将该命令放在双引号中。

_T_COMMAND_=1 valgrind ---tool=memcheck --trace-children=yes command 

一般语法简单地

[var=value ...] cmd [args] 

这将设置为value环境变量varcmd的持续时间。您可以通过这种方式设置多个变量。

或者,设置变量和export它;那么它将在当前shell的剩余时间内保持设置,并且暴露给子进程(这就是export所做的)。

_T_COMMAND_=1 
export _T_COMMAND_ 
valgrind ---tool=memcheck --trace-children=yes command 

同样,valgrind处理其选项,然后运行指定command(带任何选项)作为子进程。

双引号中的单个命令是无害的,因为shell在内核看到参数之前会剥去引号。包含双引号空格的字符串将保留为单个参数,而不带引号时,它将成为多个参数。看哪:

bash$ perl -le 'print "<<$_>>" for @ARGV' "foo bar" baz quux 
<<foo bar>> 
<<baz>> 
<<quux>> 

或者一样好,加上周围的一切无害的,但毫无疑问相当混乱双引号这是不是已经引述:

bash$ "perl" "-le" 'print "<<$_>>" for @ARGV' "yowza" 
<<yowza>> 

壳解析成

<<perl>> 
<<-le>> 
<<print "<<$_>>" for @ARGV>> 
<<yowza>> 

并删除进程中的(外部)引号。