bash:无法输出:ps -ef | grep to variable

时间:2015-09-07 06:06:50

标签: linux bash unix

我正在尝试使用Unix平台上的Bash脚本将命令的结果插入变量。 我需要使用下一个命令:ps -ef|grep <my process>,但是当我运行它时出现错误:

-bash: line 1: 5420: command not found

这是我的代码:

#!/bin/bash
ps_result=$(ps -ef|grep exe)
echo "$ps_result"

我认为这是一些语法问题,因为'grep'命令以黄色显示,但我无法修复它(我尝试使用后引号`…`但它也不起作用)。

编辑: 调试输出与代码部分相关:

+ ssh ######
++ ps -ef
++ grep exe
Pseudo-terminal will not be allocated because stdin is not a terminal.
Warning: Permanently added '#####' (RSA) to the list of known hosts.
-bash: line 1: 5447: command not found

以下是完整代码:

#!/bin/bash
ssh ##### << EOF
ps_result=$(ps -ef|grep exe)
echo "$ps_result"
EOF

我需要ps_result才能在以后进行操作。 * #####是在这里编辑而不是原始代码...

3 个答案:

答案 0 :(得分:1)

问题的初步版本

问题的初始版本有代码:

ps_result= $(ps -ef|grep exe)
echo $ps_result

分配后有一个空格,这会造成麻烦。

初步答复

shell中的赋值周围没有空格:

ps_result=$(ps -ef|grep exe)
echo "$ps_result"

您拥有的ps_result= $(ps -ef|grep exe)运行ps | grep,并捕获输出。它使用输出的第一个单词作为命令名称(nikitag,似乎)并将输出中的其余单词作为参数运行,并将环境变量ps_result设置为空串。而且由于你没有一个名为nikitag的命令,它就会失败。

对shell脚本中的空格非常,非常小心。

更新后包括ssh和此处的文档

现在问题已经更新以显示实际情况,解释问题相对简单。还有一个here documentssh

#!/bin/bash
ssh ##### << EOF
ps_result=$(ps -ef|grep exe)
echo "$ps_result"
EOF

由于未引用EOF,因此在ps启动之前在本地计算机上执行ssh命令,并将命令的输出放入此文档中。您需要在here文档的开头引用EOF,以便逐字传输文档并在远程计算机上执行:

#!/bin/bash
ssh ##### << 'EOF'
ps_result=$(ps -ef|grep exe)
echo "$ps_result"
EOF

答案 1 :(得分:0)

与跟踪显示一样,问题不在于您发布的代码中,而是在调用此代码的代码中。

没有引用的here文档将在将脚本传递给ssh之前在本地插入进程替换。在<<之后使用此文档终结符周围的单引号来修复它。

#!/bin/bash
ssh ##### <<'EOF'   # Notice quotes here
ps_result=$(ps -ef|grep exe)
echo "$ps_result"
EOF

答案 2 :(得分:-2)

代码不需要空格

#!/bin/bash
ps_result=`ps -ef|grep exe`
echo $ps_result