繁体   English   中英

命令可以从命令行运行,但不能从shell脚本运行

[英]Command works from command line but not from shell script

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

但该命令适用于命令提示符。

这是引起问题的线。 (甚至不确定下面的命令如何产生进程。)

_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 您可以通过这种方式设置多个变量。

或者,设置变量并将其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>>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM