如何循环访问一组由空格分隔的 PID?我想我记得第一步是让每个元素成为自己的行?
对于我的 Firefox 会话,它们有相当多的 PID:
$ pidof firefox
315534 315333 315196 315007 314885 314550 314493 311685 310664 307575 306443 297316 284759 284396 279546 274917 274885 274850 274729 274669 274666 271203 241078 235645 229985 156754 156565 152252 151123 149938 149548 149491 147870 137040 136986 135960 134823 113097 109238 106897 106790 106729 106488 106482 106478 106447 106414 106367 106335 106304 106261 106192 106114 93683 61965 58700 58596 54029 53959 53609 52555 52272 52268 52265 48999 48840 47771 47330 44585 31973 31240 15503 15420 15415 15413 15216 15205 15201 15074 15037 15013 14981 14942 14688 11875 11837 11804 11769 11735 11725 11686 10724 10660 10617 10213 9110 9073 9022 8888 8856 8789 8755 8692 8626 8279 8245 8212 8173 6605 6589 6555 6491 6468 6431 6421 6355 6329 6319 6188 6135 6100 5912 5896 5880 5874 5868 5857 5850 5844 5841 5839 5679 5629 5058
也许将它们放入数组中会更好?
最终,我希望获得打开文件句柄的数量。
到目前为止,所有发布的解决方案都是有效的,因此很难查看一个作为“the”答案。
编辑:让我提出另一个。虽然它由两个步骤组成。
(1) myArr=$(pidof firefox)
“用一个代码制作两个代码,魔法师,我召唤你!”
(2) for i in "${myArr[@]}"; do echo "${i}"; done
但是有人能解释为什么(1)中也可以写得myArr=( $(pidof firefox) )
一样好吗?为什么在(2)中也可以写得for i in "${myArr[@]}"; do echo "$i"; done
一样好?
感谢您的回答!你太棒了!
答案1
@HackSaw 有一个合适的答案。
一般来说,离开是有风险的任何不带引号的变量或命令替换(请参见忘记在 bash/POSIX shell 中引用变量的安全隐患)
为了完全安全,你会这样做
while read -ra words; do
# do stuff with the `words` array
printf "> %s\n" "${words[@]}"
done < <(
some_external_command
)
循环while read
读取线外部命令,并将read -a
每一行分解为单词。
< <(...)
是一个来自 a 的重定向流程替代。这避免了子shell问题和
some_external_program | while read ...
答案2
for i in `pidof firefox`; do echo "${i}"; done
但最好使用 $(...),正如 @doneal24 所指出的:
for i in $(pidof firefox); do echo "${i}"; done
或一般情况下
for i in list of things separated by blanks; do echo "${i}"; done