我正在尝试使用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才能在以后进行操作。 * #####是在这里编辑而不是原始代码...
答案 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 document和ssh
:
#!/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