我对shell脚本不是很熟悉。我想修改一个脚本,但在我更改脚本后出现错误"No such file or directory"。
但该命令在命令提示符下有效。
这是导致问题的行。 (甚至不确定下面的命令如何产生一个进程。)
_T_COMMAND_=1 "valgrind ---tool=memcheck --trace-children=yes command"
如果我运行命令也是一样的
$valgrind ---tool=memcheck --trace-children=yes command
有什么想法吗?
最佳答案
不要将命令放在双引号中。
_T_COMMAND_=1 valgrind ---tool=memcheck --trace-children=yes command
一般语法很简单
[var=value ...] cmd [args]
这将在 cmd
期间将环境变量 var
设置为 value
。您可以通过这种方式设置多个变量。
或者,设置变量并将其导出
;然后它将在当前 shell 的剩余生命周期内保持设置,并暴露给子进程(这就是 export
所做的)。
_T_COMMAND_=1
export _T_COMMAND_
valgrind ---tool=memcheck --trace-children=yes command
类似地,valgrind
处理其选项,然后将指定的命令
(带有任何选项)作为子进程运行。
双引号中的单个命令是无害的,因为 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>>
并删除过程中的(外部)引号。
关于linux - 命令可以从命令行运行,但不能从 shell 脚本运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19047957/