Чтобы исправить ошибку в команде Less, отметьте "нет".из параметров
-
22-08-2019 - |
Вопрос
Этот вопрос основан на этот поток.
Код
function man()
{
man "$1" > /tmp/manual; less /tmp/manual
}
Проблема: если я использую хотя бы один вариант, команда не знает, где находится разыскиваемое руководство
Например,
man -k find
выдает мне ошибку, так как ссылка неправильная.Команда гласит -k
как руководство пользователя.
Моя попытка решить проблему с помощью псевдокода
if no parameters
run the initial code
if one parameter
run: man "$2"
...
Другими словами, нам нужно добавить опцию-check в начало таким образом, чтобы
Псевдокод
man $optional-option(s) "$n" > /tmp/manual; less /tmp/manual
где $ n
- n=1, если вариантов ноль
- n=2, если 1 вариант
- n=3, если 2 варианта
- ....
Как вы можете сделать такую "проверку параметров", чтобы вы могли изменить значение $ n?
Развитая Проблема: создать два цикла if для ситуаций от n = 1 до n = 2
Решение
Как насчет передачи всех аргументов
function man()
{
man $@ > /tmp/manual; less /tmp/manual
}
В чем ошибка в less, о которой вы упоминаете в названии?
Другие советы
Во-первых, вы можете передать все аргументы вашей функции в man
используя $*
или $@
.Вы можете читать man sh
для получения точной информации о разнице между этими двумя;короткая история заключается в том, чтобы почти всегда использовать "$@"
в двойных кавычках.
Во-вторых, временный файл не нужен.Вы могли бы сделать это немного чище, передав выходные данные man
непосредственно к less
:
function man() {
man "$@" | less
}
Кстати, если вы просто пытаетесь использовать другой пейджер (man
использование more
и ты хочешь более причудливую less
) существует общепризнанный PAGER
переменная среды, которую вы можете настроить для переопределения пейджера по умолчанию.Вы могли бы добавить это в свой ~/.bashrc
например, чтобы указать всем программам использовать less
при отображении нескольких экранов вывода:
export PAGER=less
Чтобы ответить на ваш точный вопрос, вы можете проверить количество аргументов с помощью $#
:
if [ $# -eq 0 ]; then
: # No arguments
elif [ $# -eq 1 ]; then
: # One argument
# etc.
Вы также можете найти shift
команда полезная.Он переименовывает $2
Для $1
, $3
Для $2
, и так далее.Он часто используется в цикле для обработки аргументов командной строки один за другим:
while [ $# -gt 1 ]; do
echo "Next argument is: $1"
shift
done
echo "Last argument is: $1"