0

我正在尝试编写一个 Bash 别名(或脚本),其中列出了当前正在运行的某些特定程序。

在我的设置中,.bashrc我设置$MY_BIN_PATH了一个包含我感兴趣的所有程序的目录:

export MY_BIN_PATH=/root/repo/bin
$ > echo $MY_BIN_PATH

/root/repo/bin

列出该目录会显示许多文件。我想为其中的每一个grep输出:ps -ef

for i in `ls $MY_BIN_PATH`; 
do
  ps -ef | grep $i | egrep -v "grep|md_m|avahi"; 
done

无论其中的哪个(如果有)文件$MY_BIN_PATH正在运行,输出始终为:

/bin/grep: Unmatched [ or [^
/bin/grep: Unmatched [ or [^
/bin/grep: Unmatched [ or [^
/bin/grep: Unmatched [ or [^
/bin/grep: Unmatched [ or [^

似乎不知何故 的值在 and 之间的管道中$i遗忘”了。ps -efgrep $i

我在这里做错了什么,我怎样才能让它工作?

4

2 回答 2

5

首先,检查是否ls是某个东西的别名。也许您应该使用绝对路径ls并且不使用任何选项。确保它没有系统别名为 color-ls 或其他东西。

其次,您可以将循环标题更改为

for i in $MY_BIN_PATH/*

这也可以解决它。

于 2013-06-03T13:39:24.457 回答
5

首先,永远不要解析 ls 的输出

其次,参数需要正确引用

尝试这个:

for i in $MY_BIN_PATH/*
do
  ps -ef | grep "$i" | egrep -v "grep|md_m|avahi"
done

要在知道进程名称时获取正在运行的进程的 PID,请使用pidof()

你到底想用循环实现什么?

于 2013-06-03T13:39:46.257 回答