如果我在 bash 脚本中运行(类似于这个) 将内容发送到文件:
sudo ./bar.sh > foo
内容bar.sh:
echo 'for pid in $(ps -ef | grep "smbd" | awk '{print $2}'); do kill -9 $pid &> /dev/null; done'
foo 输出:
for pid in $(ps -ef | grep "smbd" | awk {print }); do kill -9 $pid &> /dev/null; done
$2
是迷失在外面。
预期输出:
for pid in $(ps -ef | grep "smbd" | awk '{print $2}'); do kill -9 $pid &> /dev/null; done
我怎样才能得到它?
答案1
首先,永远不要运行东西,sudo
除非确实有必要运行它们sudo
。我真的无法充分强调这一点。除非您收到“权限被拒绝”错误,否则您不需要sudo
也不应该使用sudo
.所以你不需要sudo ./bar.sh
,只要跑就可以了./bar.sh
。
接下来,您不需要echo
获取命令的结果。这是不需要的:
echo '$(ps -ef | grep "smbd" | awk '{print $2}')'
您所需要的只是运行命令本身。您不需要命令替换 ( $(command)
) 或 echo。只需在您的脚本中添加以下内容即可:
ps -ef | grep "smbd" | awk '{print $2}'
请注意,如果您想获取正在运行的进程的 PID,那么您实际上也不需要ps
。您可以只使用它,以避免过程本身出现在结果中pgrep smbd
的问题。grep
最后,如果你想打印多行字符串作为输出,你可以使用这里是文档而不是许多 echo 语句。因此,将所有这些放在一起,您应该像bar.sh
这样:
#!/bin/sh
cat <<'EoF'
for pid in $(ps -ef | grep "smbd" | awk '{print $2}'); do
kill -9 "$pid" &> /dev/null
done
EoF
然后运行它./bar.sh > foo
(不sudo
!)。
或者,这是相同方法的更简单版本:
#!/bin/sh
cat <<'EoF'
ps -ef | awk '/smbd/{print $2}' | while read pid; do
kill -9 "$pid" &> /dev/null
done
EoF
或者,更简单:
#!/bin/sh
printf '%s\n' 'kill -9 $(pgrep smbd)'
这就引出了最后一点:你是吗?当然你真的想要一个脚本吗?要终止所有正在运行的smbd
进程,您只需要一个命令:
pkill -9 smbd