Procura pelo comando com curinga

4

Eu fiz algumas pesquisas, mas infelizmente a minha pergunta nunca foi respondida. A questão mais próxima é a minha: Procure pelo comando bash

O que eu preciso: Um comando para procurar por comandos instalados usando curingas. Digamos que eu queira desmontar algo, mas esqueci o comando. Eu sei que contém "monte". Então eu faria algo assim:

searchfor *mount*

Para descobrir que unmount é o comando de que preciso. Eu sei man -k ou yum whatprovides . Mas não é isso que estou procurando. Eu quero procurar por todos os comandos instalados (que podem ser encontrados nos diretórios fornecidos pela variável $PATH ).

    
por Daniel Hoop 01.04.2018 / 21:17

5 respostas

10

O meu caminho é usar compgen -c . Por exemplo, para encontrar todos comandos que contêm mount :

$ compgen -c | grep mount
gvfs-mount
mmount
ideviceimagemounter
grub-mount
humount
hmount
umount
mountpoint
mount
fusermount
umount
mount.ntfs
mount.lowntfs-3g
mount.cifs
umount.udisks
mount.nfs
umount.nfs
mount
mount.ntfs-3g
mount.fuse
showmount
rpc.mountd
mountesp
umount.udisks2
mountstats
automount

O que é bom em compgen -c é que ele também encontra aliases, funções de usuário e comandos internos do Bash, por exemplo:

$ alias aoeuidhtn='echo hi'
$ compgen -c | grep aoeuidhtn
aoeuidhtn
$ my-great-function() { printf "Inside great function()\n"; }
$ compgen -c | grep great
my-great-function
$ compgen -c | grep '^cd$'
cd

Além disso, compgen faz parte do Bash, por isso está sempre disponível. Conforme descrito por help compgen :

Display possible completions depending on the options.

Intended to be used from within a shell function generating possible completions.  If the optional WORD argument is supplied, matches against WORD are generated.

Exit Status:
Returns success unless an invalid option is supplied or an error occurs.

    
por 01.04.2018 / 21:54
2
#! /bin/bash
s=$1  # e.g. mount
IFS=:
for p in $PATH ; do
    ls "$p/"*"$s"* 2>/dev/null
done

A configuração de $IFS para : torna a for iterar corretamente sobre os membros de $PATH . Redirecionar stderr para / dev / null oculta mensagens de erro para diretórios que não contêm correspondências.

    
por 01.04.2018 / 21:25
1

Isso pode ser feito de muitas maneiras diferentes, procure em caminhos $ PATH, use o comando locate etc.

 find $(echo $PATH|tr ':' ' ') -maxdepth 1 -name '*mount*' 
    
por 01.04.2018 / 21:41
1

Para o registro, em zsh :

type -m '*mount*'

Encontrará todas as correspondências e, para cada uma, informará o que (executável, função, alias ...) e onde elas estão.

$ type -m 'zc*'
zc is an alias for zcalc
zcalc is an autoload shell function
zcompile is a shell builtin
zcat is /bin/zcat
zcmp is /bin/zcmp
    
por 01.11.2018 / 12:21
0

Isso é baseado resposta da choroba , mas só usa recursos do Bash (escritos para o GNU Bash 4.3.11). Ele retorna o sucesso se qualquer correspondência for encontrada, caso contrário, falhará.

#!/bin/bash
shopt -s nullglob
s="${1:?}"  # Error if argument is missing or null.
exit=1  # Return failure unless changed.
IFS=:
for p in $PATH; do
    for f in "$p/"*"$s"*; do
        if [[ -f $f ]]; then
            echo "$f"
            exit=0  # Return success since match found.
        fi
    done
done
exit $exit
    
por 02.04.2018 / 06:48

Tags