我一直在编写具有多种功能的脚本。
我正在尝试添加一个函数,显示“/usr/share/applications”文件夹中所有应用程序的 whatis 命令输出,而不显示“不合适”的行。
我当前的命令尝试是:
whatis $(ls /usr/share/applications | cut -d "." -f 1) | grep -i -v "nothing appropriate"
我遇到的问题是 grep 命令似乎不起作用,因此仍然显示包含短语“nothing proper”的行。
我还尝试了许多替代方法,包括使用“replace”和“sed”命令将不需要的行转换为空白区域,但这些也未能解决问题。
所有上述尝试,我都尝试过直接输出命令,也尝试过将输出路由到文件中,并对文件的“cat”输出执行过滤器。
有没有人可以推荐任何替代品?
错误消息通常写入
stderr
,而您只是通过管道stdout
传输到grep
. 要在类似 Bourne 的 shell 中同时通过管道传输 stdout 和 stderr,fish
请执行以下操作:请注意,这意味着 stdout 和 stderr 最终会合并到 stdout 上。
那里的外壳看到了一个管道,因此它将其拆分为
whatis... 2>&1
并grep -v 'nothing appropriate'
用左侧的标准输出(文件描述符 1)作为管道的写入端,而右侧的标准输入(fd 0)作为另一个管道的标准输入(fd 0)。该管道的末端,每一方在单独的进程中同时运行。在每一侧,处理重定向。
2>&1
说:将 fd 2 重定向到与 fd 1 上打开的相同的东西,这里是管道。所以 fd 1 和 2 都进入管道。类似 rc 的 shell 的等效语法是
whatis... >[2=1] | grep...
and withcsh
-like shell:whatis... |& grep...
(也适用于 zsh)。使用或
ksh93
,您也可以只发送到过滤管道:zsh
bash
stderr
但请注意,
grep
不会等待该命令,因此您可能最终会在命令返回后看到其他错误消息。这可以通过以下方式避免zsh
:(或者在and中更痛苦
ksh93
bash
)。在
yash
中,您可以使用进程重定向(语法与进程替换相似,但不同之处在于它是重定向运算符,而不是扩展),同样的问题是过滤命令未被等待:请注意,
cut -d "." -f 1
您最终会更改org.gnome.Settings.desktop
为org
而不是org.gnome.Settings
. 因为您正在调用 split+glob,所以对于包含 of$IFS
或 glob 字符的应用程序名称也会遇到问题。使用
zsh
,您可以:where
:t
获取t
文件的 ail (dirname) 和:r
根名称(不带扩展名),|&
是2>&1 |
.在
bash
中,您可以执行以下操作:"${@##*/}"
的等价物在哪里:t
,"${@%.*}"
的等价物:r
。使用 GNU
ls
9.0 或更高版本,您还可以:where
ls --zero
以可后处理的格式输出列表,sed
删除.desktop
扩展名并在有替换时输出结果(因此排除没有.desktop
扩展名的文件),xargs
将列表传递给whatis
,并grep
过滤掉nothing appropriate
错误。使用 GNU
basename
,您还可以:还要注意,桌面文件的名称通常与它们执行的可执行文件的名称不匹配(如果有的话),因此很可能没有相应的手册页。
除了将 rootname 传递给,您还可以提取这些文件
whatis
的一些字段。.desktop
例如:将提取
GenericName
这些文件中第一次出现的字段的值。