Вот функция, которая перечисляет содержание каталогов $PATH
. Если передаваемые аргументы, функция только перечисляет команды, имя которых содержит один из аргументов. Аргументы интерпретируются как шаблоны шарика.
shopt -s extglob
lspath () {
local IFS pattern
IFS='|'
pattern="*@($*)*"
IFS=':'
for d in $PATH; do
for x in "$d/"$pattern; do
[ "$x" = "$d/$pattern" ] || echo "${x##*/}"
done
done | sort -u
}
Как много вещей, это легче в zsh.
lspath () {
(($#)) || set ''
print -lr -- $^path/*$^@*(N:t) | sort -u
}
^
символ в расширении параметра заставляет текст, связанный с массивом быть добавленным к каждому элементу массива, например. path=(/bin /usr/bin); echo $^path/foo
печать /bin/foo /usr/bin/foo
./*$^@*
похож на оскорбление комиксов, но на самом деле обычный символ /
, подстановочный знак *
, специальный параметр $@
(массив позиционного параметра) с ^
модификатор, и снова *
.(N:t)
спецификатор шарика N
получить пустое расширение, если там не идет ни в какое сравнение сопровождаемый модификатором истории t
сохранять только базовое имя (“хвост”) каждого соответствия.
Более загадочный, избегает внешнего вызова, но это только представляет косметический интерес:
lspath () {
(($#)) || set ''
local names; names=($^path/*$^@*(N:t))
print -lr -- ${(ou)names}
}
Можно на самом деле искать apropos
команда, которая ищет страницы справочника команд, краткое описание которых содержит ключевое слово. Ограничение - то, что это только находит команды, которые имеют страницу справочника.
Короче говоря: ни одна из этих двух программ не будет работать правильно. Вывод из этих двух программ будет объединен и отослал последовательный порт. Вход, входящий через последовательный порт, будет замечен только одной из программ (некоторый вход закончится в одной из программ, некоторый вход закончится в другом, случайным образом).
Из-за этого программы обычно с помощью последовательных портов (uucp традиционно, pppd и эмуляторы терминала в последнее время) реализовали некоторую блокировку. Это - консультативная блокировка (это не осуществляется), с помощью файлов блокировки в некотором предварительно сконфигурированном глобальном каталоге (/var/lock, например).