Поиск команды с подстановочным знаком

Поскольку в вопросе используется слово «подход», это подразумевает, что ответ должен быть «схематичным» или несколько «общим», поэтому я заявляю следующие шаги, которые можно использовать для достижения этого:

  • Напишите ожидаемый -скрипт, который принимает аргумент , который должен быть отправлен на / home / alice / math ].
  • Напишите BASH-скрипт (например, / home / user / newprogram ), который вызывает ожидаемый-скрипт в цикле с аргументами, переданными вашему BASH-скрипту, и с подстановкой команд , чтобы поймать его вывод.
  • Используйте свой любимый инструмент для обработки текста, например grep , чтобы извлечь необходимые данные и сохранить их в переменных (для этого вам нужно направить полученный результат в grep , снова используя подстановку команд для захвата данных, grep команда доставляет и сохраняет это в переменной).
  • Выведите переменные, которые вы проанализировали на шаге перед этим шагом, в виде таблицы.

Эти шаги предполагают наличие доступа к файлу (например, бит выполнения и чтения) к / home / alice / math . Конечно, если это не так, можно, например:

  • Изменить права доступа или владельца для / home / alice / math только с помощью chmod или chown .
  • Поместите alice и пользователя в общую группу с достаточными правами, чтобы оба пользователя имели доступ к / home / alice / math .

6
01.11.2018, 12:45
5 ответов

Мой любимый способ — использовать compgen -c. Например, чтобы найти все команды, содержащие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

Что хорошо в compgen -c, так это то, что он также находит псевдонимы, пользовательские функции и встроенный Bash -в командах, например:

$ 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

Кроме того, compgenявляется частью Bash, поэтому он всегда доступен. Как описано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.

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

Установка $IFSна :заставляет forправильно перебирать элементы $PATH. Перенаправление stderr на /dev/null скрывает сообщения об ошибках для каталогов, не содержащих совпадений.

2
27.01.2020, 20:21

Это можно сделать разными способами: искать в путях $PATH, использовать команду locate и т. д.

 find $(echo $PATH|tr ':' ' ') -maxdepth 1 -name '*mount*' 
1
27.01.2020, 20:21

Это основано на ответе choroba , но использует только функции Bash (, написанные для GNU Bash 4.3.11 ). Он возвращает успех, если какие-либо совпадения найдены, в противном случае — отказ.

#!/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
0
27.01.2020, 20:21

Для протокола, вzsh:

type -m '*mount*'

Найдет все совпадения и для каждого сообщит (какой исполняемый файл, функцию, псевдоним... )и где они находятся.

$ 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
1
27.01.2020, 20:21

Теги

Похожие вопросы