Eu tenho trabalhado em um script com uma variedade de funções.
Estou tentando adicionar uma função que mostra a saída do comando whatis para todos os aplicativos na pasta "/usr/share/applications", sem mostrar linhas que dizem "nada apropriado".
Minha tentativa de comando atual é:
whatis $(ls /usr/share/applications | cut -d "." -f 1) | grep -i -v "nothing appropriate"
O problema que estou tendo é que o comando grep não parece estar funcionando, então as linhas contendo a frase "nada apropriado" ainda estão sendo exibidas.
Também tentei várias alternativas, incluindo o uso dos comandos "replace" e "sed" para converter as linhas indesejadas em espaço vazio, mas também não conseguiram resolver o problema.
Todas as tentativas acima mencionadas, tentei a saída do comando diretamente e também tentei rotear a saída para um arquivo e executar os filtros na saída "cat" do arquivo.
Alguém tem alguma alternativa que possa recomendar?
As mensagens de erro geralmente são gravadas em
stderr
, e você está apenas canalizandostdout
paragrep
. Para canalizar stdout e stderr, em shells semelhantes a Bourne defish
, você faz:Observe que isso significa que stdout e stderr acabam sendo mesclados em stdout.
O shell lá vê um pipeline, então ele o divide em
whatis... 2>&1
egrep -v 'nothing appropriate'
e os conecta com o stdout (descritor de arquivo 1) do esquerdo sendo a extremidade de escrita de um tubo e o stdin (fd 0) do direito sendo o outro extremidade desse pipe, cada lado executando simultaneamente em processos separados.Em cada lado, os redirecionamentos são processados.
2>&1
diz: redirecione o fd 2 para a mesma coisa que abriu no fd 1, aqui o pipe. Então, tanto fd 1 quanto 2 vão para o tubo.A sintaxe equivalente para shells do tipo rc é
whatis... >[2=1] | grep...
e comcsh
shells -like:whatis... |& grep...
(também funciona em zsh).Com
ksh93
,zsh
oubash
, você também pode enviarstderr
apenas para um pipe de filtragem com:Mas observe que esse
grep
comando não é esperado, então você pode acabar vendo as outras mensagens de erro após o retorno do comando. Isso pode ser evitadozsh
com:(ou mais dolorosamente em
ksh93
ebash
).Em
yash
, você pode usar o redirecionamento de processo (com sintaxe semelhante à substituição de processo , mas diferente por ser um operador de redirecionamento, não uma expansão), com o mesmo problema wrt o comando de filtragem não sendo esperado:Cuidado que com
cut -d "." -f 1
você acaba mudandoorg.gnome.Settings.desktop
paraorg
em vez deorg.gnome.Settings
. Como você está invocando split+glob, também terá problemas para nomes de aplicativos que contenham caracteres de$IFS
ou glob.Com
zsh
, você faria:Where
:t
pega ot
ail (dirname) do arquivo e:r
o nome da raiz (sem extensão) e|&
é a abreviação de2>&1 |
.Em
bash
, você pode fazer algo se aproximando com:Onde
"${@##*/}"
faz o equivalente de:t
,"${@%.*}"
o equivalente de:r
.Com GNU
ls
9.0 ou mais recente, você também pode fazer:Onde
ls --zero
gera a lista em um formato pós-processável,sed
remove a.desktop
extensão e gera o resultado se houver uma substituição (portanto, excluindo arquivos sem.desktop
extensão),xargs
passa a listawhatis
egrep
filtra osnothing appropriate
erros.Com GNU
basename
, você também pode fazer:Observe também que o nome dos arquivos da área de trabalho geralmente não corresponde ao nome do executável que eles executam e, portanto, é provável que não tenham uma página de manual correspondente.
Em vez de passar o rootname para
whatis
, você também pode extrair alguns campos desses.desktop
arquivos. Por exemplo:Extrairia o valor da primeira ocorrência de um
GenericName
campo nesses arquivos.