例如,运行多个命令后:
$ cd /opt/something
$ find . -name *aa | grep 11
$ clear
$ <more commands go here>
有一部分输出需要但未保存;产生它的命令以及参数可能不会被完全回忆起来。
有没有办法进行搜索stdout
(即使clear
可能已被调用多次)。
答案1
标准输出是暂时的或短暂的。除非您采取一些措施来保存它,否则它一输出就会消失并且无法访问。
如果您想多次重复使用命令的输出,那么您需要将其保存在某处 - 标量变量(例如命令替换)、数组变量(例如使用readarray
/ mapfile
)或文件(例如使用重定向或tee
)。
使用文件名时,应始终使用 NUL 作为分隔符,如下所示全部其他字符是路径名中的有效字符(当今最常见的工具有-0
、-z
、-Z
或类似选项用于处理 NUL 分隔的输入和输出)。这意味着使用命令替换是不安全的find
(尽管对于生成非文件名文本的其他程序来说没问题)。
例如
find . name '*aa' -print0 > files.list0
grep -z 11 files.list0
或者
readarray -d '' -t files < <(find . -name '*aa' -print0)
printf '%s\0' "${files[@]}" | grep -z 11
顺便说一句,应该*aa
在该命令中引用find
,否则 shell 会将其扩展到所有匹配的文件(并且只有第一个属于谓词-name
,其余的将是错误)。