我对shell脚本不太熟悉。我想修改一个脚本,但是在我更改之后它给了我错误 “没有这样的文件或目录” 。
但该命令适用于命令提示符。
这是引起问题的线。 (甚至不确定命令如何产生进程。)
_T_COMMAND_=1 "valgrind ---tool=memcheck --trace-children=yes command"
如果我将命令作为
运行,同样的事情$valgrind ---tool=memcheck --trace-children=yes command
有什么想法吗?
答案 0 :(得分:2)
不要将命令放在双引号中。
_T_COMMAND_=1 valgrind ---tool=memcheck --trace-children=yes command
一般语法只是
[var=value ...] cmd [args]
将在var
期间将环境变量value
设置为cmd
。您可以通过这种方式设置多个变量。
或者,设置变量并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>>
shell将其解析为
<<perl>>
<<-le>>
<<print "<<$_>>" for @ARGV>>
<<yowza>>
并删除过程中的(外部)引号。