cou=`ps -ef|grep "9161"|grep -v grep|wc -l` 为什么这条命令单独拿出来执行,echo $cou显示是1,放到脚本里面执行,echo $cou显示就变成3了?
时间: 2024-09-30 16:09:50 浏览: 31
Linux 启动停止SpringBoot jar 程序部署Shell 脚本的方法.zip
这个命令的意思是获取当前进程中包含字符串"9161"的所有进程,并排除grep自身(grep -v grep),然后计算结果行数(`wc -l`),并将计数值赋给变量$cou。当将这行命令单独执行时,它会在命令行环境中运行,由于grep会返回匹配的结果行,所以echo $cou 显示的是1。
然而,在脚本中执行,尤其是shell脚本(bash或其他shell),这里有几个可能的原因导致`echo $cou` 显示变为了3:
1. **分词解析**:脚本环境下,bash 可能会以空格或者其他特殊字符分割执行语句,可能导致整个命令被执行多次,每个命令都生成一行输出,总计就是3次的计数。
2. **shell历史记录**:如果上一次执行过类似命令并将其添加到了历史记录中,再次敲入相同的命令可能会触发历史记录回放,这也会增加计数。
3. **后台进程**:如果在脚本中执行时,含有grep的部分可能在后台持续运行,而wc部分等待其完成后再打印结果,这时显示的可能是包括grep在内的所有进程行数。
4. **递归查找**:如果grep选项中包含了递归搜索(-R 或者 equivalent),那么它可能会找到其他匹配的进程,并计入计数。
要解决这个问题,你可以尝试在脚本中使用单引号 `'...` 来确保命令作为一个整体执行,或者加上`>/dev/null` 来禁止标准输出,只保留计数部分。例如:
```bash
cou=$(ps -ef | grep -v 'grep' | grep '9161' | wc -l; echo $cou)
```
这样就可以避免上述问题了。
阅读全文