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

标签 linux shell

我对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/

相关文章:

c++ - 使用 epoll 处理多个并发请求

linux - 识别arm中的系统调用

java - 在不同时区的一台机器上运行服务器

c - 如何使用最少的代码行将 C 结构存储在人类可读的文件中?

bash - 跟踪在 shell 脚本(例如 zsh)中执行的 shell 命令

linux - 从 ps -ef |grep 关键字获取 pid

linux - 使用输入重定向(stdin)取消设置日志名

linux - Apache2、虚拟主机、CentOs : root context and subcontext on one server

bash - 如何使用 bash 对文件中的每一列求和

shell - 将文件中字符串的值分配给变量