Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 命令可以从命令行工作,但不能从shell脚本工作_Linux_Shell - Fatal编程技术网

Linux 命令可以从命令行工作,但不能从shell脚本工作

Linux 命令可以从命令行工作,但不能从shell脚本工作,linux,shell,Linux,Shell,我不太熟悉shell脚本。我想修改一个脚本,但在我更改脚本后,它会给我错误“没有这样的文件或目录” 但该命令在命令提示符下工作 这是导致问题的线路。(甚至不知道下面的命令如何生成进程。) 若我运行命令作为 $valgrind ---tool=memcheck --trace-children=yes command 有什么想法吗 不要将命令放在双引号中 _T_COMMAND_=1 valgrind ---tool=memcheck --trace-children=yes command 一

我不太熟悉shell脚本。我想修改一个脚本,但在我更改脚本后,它会给我错误“没有这样的文件或目录”

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

这是导致问题的线路。(甚至不知道下面的命令如何生成进程。)

若我运行命令作为

$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生命周期的剩余时间内保持设置,并暴露于子进程(这就是导出的作用)

类似地,
valgrind
处理其选项,然后作为子流程运行指定的
命令(带有任何选项)

双引号中的单个命令是无害的,因为shell将在内核看到参数之前去掉引号。双引号中带有空格的字符串将作为单个参数保留,而如果没有引号,它将成为多个参数。瞧:

bash$ perl -le 'print "<<$_>>" for @ARGV' "foo bar" baz quux
<<foo bar>>
<<baz>>
<<quux>>
bash$perl-le“print”表示@ARGV的“foo-bar”baz-qux
或者,也可以在所有未引用的内容周围添加无害但无疑相当混乱的双引号:

bash$ "perl" "-le" 'print "<<$_>>" for @ARGV' "yowza"
<<yowza>>
bash$“perl”-le“print”代表@ARGV的“yowza”
shell将其解析为

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

>

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

要执行命令,需要执行
var=$(command)
。因此,您需要类似于
\u T\u COMMAND.=$(valgrind--tool=memcheck--trace children=yes COMMAND)
的东西,但它使用的是\u T\u COMMAND\u=1“COMMAND”。我已经修改为_T_COMMAND_=1“valgrind--tool=memcheck--trace children=yes COMMAND”放弃了脚本更改。。。通过将valgrind添加到特定子进程,解决cpp代码更改的问题!!!
bash$ "perl" "-le" 'print "<<$_>>" for @ARGV' "yowza"
<<yowza>>
<<perl>>
<<-le>>
<<print "<<$_>>" for @ARGV>>
<<yowza>>