我想实时监控一个进程的内存/cpu 使用情况。类似于top但仅针对一个过程,最好带有某种历史图表。
如何在 cli 上将纪元时间戳转换为人类可读的格式?我认为有一种方法可以用日期来做到这一点,但语法让我望而却步(欢迎其他方式)。
我一直看到引用此链接的答案明确指出“不要解析ls!” 这让我感到困扰有几个原因:
似乎该链接中的信息已被批量接受,几乎没有问题,尽管我可以在随意阅读中至少挑出一些错误。
该链接中所述的问题似乎也引发了不想找到解决方案的愿望。
从第一段:
...当你要求
[ls]一个文件列表时,有一个大问题:Unix 允许文件名中的几乎任何字符,包括空格、换行符、逗号、管道符号,以及几乎任何你曾经尝试用作除 NUL 外的分隔符。...ls用换行符分隔文件名。这很好,直到您的文件名称中包含换行符。并且由于我不知道任何ls允许您使用 NUL 字符而不是换行符终止文件名的实现,这使我们无法使用ls.
无赖,对吧?如何以往我们可以处理一个换行符终止的上市数据集可能包含换行符的数据?好吧,如果这个网站上回答问题的人不是每天都做这种事情,我可能会认为我们遇到了麻烦。
事实是,大多数ls实现实际上提供了一个非常简单的 api 来解析它们的输出,我们一直在做,甚至没有意识到。您不仅可以以 null 结束文件名,还可以以 null 或您可能需要的任何其他任意字符串开头。更重要的是,您可以为每个文件类型分配这些任意字符串。请考虑:
LS_COLORS='lc=\0:rc=:ec=\0\0\0:fi=:di=:' ls -l --color=always | cat -A
total 4$
drwxr-xr-x 1 mikeserv mikeserv 0 Jul 10 01:05 ^@^@^@^@dir^@^@^@/$
-rw-r--r-- 1 mikeserv mikeserv 4 Jul 10 02:18 ^@file1^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file2^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul …Run Code Online (Sandbox Code Playgroud) 有一些命令可以过滤或作用于输入,然后将其作为输出传递,我认为通常是stdout- 但有些命令只会接受stdin并执行它们对它所做的任何事情,并且不输出任何内容。
我最熟悉 OS X,因此我立即想到了两个pbcopy和pbpaste- 它们是访问系统剪贴板的方法。
无论如何,我知道如果我想使用 stdout 并将输出输出到两个stdout文件和一个文件,那么我可以使用该tee命令。我对 有一点了解xargs,但我认为这不是我要找的。
我想知道如何拆分stdout以在两个(或多个)命令之间切换。例如:
cat file.txt | stdout-split -c1 pbcopy -c2 grep -i errors
Run Code Online (Sandbox Code Playgroud)
可能有一个比那个更好的例子,但我真的很想知道如何将标准输出发送到一个不中继它的命令,同时避免stdout被“静音” - 我不是问如何cat归档和grep它的一部分并将其复制到剪贴板 - 具体命令并不那么重要。
另外 - 我不是在问如何将它发送到文件,而且stdout- 这可能是一个“重复”的问题(抱歉),但我做了一些查找,只能找到类似的询问如何在标准输出和文件之间拆分的问题- 这些问题的答案似乎是tee,我认为这对我不起作用。
最后,你可能会问“为什么不让 pbcopy 成为管道链中的最后一件事?” 我的回答是 1) 如果我想使用它并且仍然在控制台中看到输出怎么办?2)如果我想使用两个stdout在处理输入后不输出的命令怎么办?
哦,还有一件事 - 我意识到我可以使用tee一个命名管道(mkfifo),但我希望有一种方法可以简洁地内联完成,无需事先设置:)
在 POSIX shell 中使用while 循环来处理文本通常被认为是不好的做法吗?
正如Stéphane Chazelas 所指出的,不使用 shell 循环的一些原因是概念、可靠性、易读性、性能和安全性。
这个答案解释了可靠性和易读性方面:
while IFS= read -r line <&3; do
printf '%s\n' "$line"
done 3< "$InputFile"
Run Code Online (Sandbox Code Playgroud)
为了性能,从文件或管道读取时,while循环和读取非常慢,因为内置的read shell一次读取一个字符。
怎么样的概念和安全性方面?
如果您已经关注 unix.stackexchange.com 一段时间了,那么您现在应该知道,echo $var在 Bourne/POSIX shell(zsh 是例外)中的列表上下文(如)中不加引号的变量具有非常特殊的含义,并且除非你有很好的理由,否则不应该这样做。
在这里的许多问答中详细讨论了它(例如:为什么我的 shell 脚本会因空格或其他特殊字符而窒息?,何时需要双引号?,shell 变量的扩展以及 glob 和 split 对其的影响,引用vs 不带引号的字符串扩展)
自从 70 年代末 Bourne shell 首次发布以来就是这种情况,并且没有被 Korn shell 改变(David Korn 最大的遗憾之一(问题 #7))或者bash大部分复制了 Korn shell,这就是POSIX/Unix 是如何指定的。
现在,我们仍然在这里看到许多答案,甚至偶尔会公开发布未引用变量的 shell 代码。你会认为人们现在已经学会了。
根据我的经验,主要有 3 类人会省略引用他们的变量:
初学者。这些可以被原谅,因为它是一种完全不直观的语法。我们在这个网站上的职责是教育他们。
健忘的人。
即使经过反复锤击也不相信的人,他们认为Bourne shell 的作者肯定没有打算让我们引用所有变量。
如果我们揭露与此类行为相关的风险,也许我们可以说服他们。
如果您忘记引用变量,那么最糟糕的事情是什么。真的有那么糟糕吗?
我们在这里谈论什么样的漏洞?
在什么情况下会出现问题?
使用版本控制系统时,当差异显示为 时,我对噪音感到恼火No newline at end of file。
所以我想知道:如何在文件末尾添加换行符以摆脱这些消息?
只是寻找之间的区别
2>&-2>/dev/null|&&>/dev/null>/dev/null 2>&1以及它们与非的Bourne shell喜欢便携性tcsh,mksh等等。
我有一个最初在前台运行的进程。我通过Ctrl+暂停Z,然后通过 恢复其在后台运行bg <jobid>。
我想知道如何挂起在后台运行的进程?
如何将后台进程带到前台?
编辑:
进程输出到stderr,那么我应该如何fg <jobid>在进程输出到终端时发出命令?
我想为每个匹配运行一次 java 命令ls | grep pattern -。在这种情况下,我想我可以做,find pattern -exec java MyProg '{}' \;但我对一般情况很好奇 - 有没有一种简单的方法可以说“为每一行标准输入运行一次命令”?(在鱼或bash中。)
shell ×10
bash ×3
command-line ×2
csh ×1
date ×1
fish ×1
job-control ×1
ls ×1
monitoring ×1
newlines ×1
portability ×1
process ×1
quoting ×1
security ×1
shell-script ×1
top ×1