bash - 奇怪的 bash 行为

标签 bash ls

所以我试图获取我当前正在其中运行程序的所有目录的列表,这样我就可以跟踪我目前正在运行的大量作业。

当我单独运行命令时,它们似乎都有效,但是当我将它们链接在一起时,出现了问题...(ll 只是常规的 ls -l 别名)

for pid in `top -n 1 -u will | grep -iP "(programs|to|match)" | awk '{print $1}'`; 
    do 
    ll /proc/$pid/fd | head -n 2 | tail -n 1; 
done

enter image description here

为什么当我在 for 循环中使用 ll/proc/31353/fd 时,它无法访问该文件,但当我正常使用它时它工作正常吗?

并通过 hexdump -C 进行管道传输:

$ top -n 1 -u will | 
    grep -iP "(scatci|congen|denprop|swmol3|sword|swedmos|swtrmo)" | 
        awk '{print $1}' | hexdump -C
00000000  1b 28 42 1b 5b 6d 1b 28  42 1b 5b 6d 32 31 33 35  |.(B.[m.(B.[m2135|
00000010  33 0a 1b 28 42 1b 5b 6d  1b 28 42 1b 5b 6d 32 39  |3..(B.[m.(B.[m29|
00000020  33 33 31 0a 1b 28 42 1b  5b 6d 1b 28 42 1b 5b 6d  |331..(B.[m.(B.[m|
00000030  33 30 39 39 36 0a 1b 28  42 1b 5b 6d 1b 28 42 1b  |30996..(B.[m.(B.|
00000040  5b 6d 32 36 37 31 38 0a                           |[m26718.|
00000048

最佳答案

chepner had the right hunch . top 的输出是为人类设计的,而不是为解析而设计的。 hexdump 显示 top 正在生成一些终端转义序列。这些转义序列是该行第一个字段的一部分,因此生成的文件名类似于 /proc/\e(B\e[m\e(B\e[m21353/pid 而不是/proc/21353/pid 其中 \e 是转义字符。

请改用 pspgreppidof。在 Linux 下,您可以使用 -C 选项到 ps 来匹配一个确切的程序名称(重复该选项以允许多个名称)。使用-o选项控制显示格式。

for pid in $(ps -o pid= -C scatci -C congen -C denprop -C swmol3 -C sword -C swedmos -C swtrmo); do 
  ls -l /proc/$pid/fd | head -n 2 | tail -n 1
done

如果你想通过降低 CPU 使用率来排序:

for pid in $(ps -o %cpu=,pid= \
                -C scatci -C congen -C denprop -C swmol3 -C sword -C swedmos -C swtrmo |
             sort -k 1gr |
             awk '{print $2}'); do 

enter image description here

此外,使用反引号代替美元圆括号进行命令替换——反引号内的引号表现得有些奇怪,而且很容易在那里出错。在美元括号内引用很直观。

关于bash - 奇怪的 bash 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21335675/

相关文章:

bash - 使用 ls,如何在不打印扩展名(点后面的部分)的情况下列出文件?

linux - ll、ls 和 block 大小 M 或 G 之间哪个文件大小最准确?

c - 如何处理 "warning: ignoring return value of ‘system’ , "

bash - 对某些目录 makefile 中的文件进行简单循环

regex - Linux:如何仅使用 ls 列出所有文件/目录

ls - 为什么某些文件的组显示数字(看起来像 ID),而不是字母字符串?

bash - 从 docker 运行更长的命令

linux - 检查 g++ 的返回值

bash - 如何更改特定字符序列的 bash 输出颜色

mysql - 如何使 MySQL 脚本在 Linux 环境中 MySQL 服务器重新启动时自动运行