- Мотивы и мотивы
@ CharlesDuffy уже подробно предупрежден, и его предупреждения не следует воспринимать легкомысленно.
Этот ответ будет пытаться быть наименее худшим подходом дляделать это неправильно и самым правильным способом и попытаться ответить на поставленный вопрос.
Запрос и требование
Для этого упражнения мы хотим создать псевдоним с аргументом, который может быть либо именем файла, либо строкой.
В начале
Ссылка была сделана на некоторые command
, для целей этого ответа мы предположим, что:
$ which command
/usr/bin/command
Нахождение файла или определение для
$f
В идеале мы должны знать полный путь к тому, где мы можем найти filename.style
, но предположим, что поиск его - единственный вариант.Настоятельно рекомендуется выполнять эти типы задач один раз при запуске или в качестве службы cron и назначать разрешенное значение переменной среды.
Вывод, полученный с помощью find
или ls
, следует учитывать длятолько для интерактивного обслуживания, не для использования в сценариях .Предпочтительный метод обхода каталога в скриптах BASH 4+ - globstar , который мы будем использовать в этих примерах.
Активируйте globstar
и, при необходимости, найдите файл в скрипте запуска, т.е.~/.bashrc
~/.profile
и др.
# activating globstar is not is required for these examples
shopt -s globstar
# optionally search and find filename.style once on startup
for f in **/filename.style; do
break;
done
if [ ! -e $f ]; then
f=fixed;
fi
export FILENAME_STYLE="$f";
# Use $FILENAME_STYLE to construct a simple alias
# alias command='/usr/bin/command $FILENAME_STYLE'
В этом обсуждении мы собираемся игнорировать накладные расходы при поиске файлов, чтобы проиллюстрировать сложные функции в реализации псевдонимов.Следующая команда развернет глобус и определит для $f
:
f=(**/filename.style)
В случае обнаружения нескольких файлов в качестве $f == ${f[0]}
.
будет использоваться только индекс 0. Убедитесь, что
$f
существует, или присвойте строку
"fixed"
Мы обеспокоены только тем, что $f
не существует, использование встроенного в BASH test
выражения ! -e $f
обеспечит достоверностьсм. man test
для деталей .
Быстрый и грязный сокращенный подход заключается в использовании AND_IF &&
, который также не одобряется , поскольку он ведет себя иначе, чем if..then..else..fi
и может привести к нежелательным результатам.Эти предупреждения не следует воспринимать легкомысленно, если вы уверены только на 99%, лучше наберите 8 дополнительных символов и будьте уверены.
[[ ! -e $f ]] && f=fixed;
Предпочтительный метод:
if [ ! -e $f ]; then f=fixed; fi;
Для псевдонима или для работы вместо
Достаточно сказано о плюсах и минусах, мы сосредоточимся на различиях в реализации.
Псевдоним - это простой ярлык, позволяющий избежать ввода длинных команд или всегда повторять одни и те же параметры.Он не может принимать аргументы, вместо этого они добавляются, и он должен быть спроектирован таким образом, чтобы функционировать соответствующим образом.
alias command='f=(**/filename.style); [[ ! -e $f ]] && f=fixed; /usr/bin/command "$f"';
или:
alias command='f=(**/filename.style); if [ ! -e $f ]; then f=fixed; fi; /usr/bin/command "$f"';
Функции принимают аргументы, к ним нельзя добавлятьи должен быть спроектирован соответствующим образом для правильной передачи аргументов.Эти примеры намеренно отражают реализации псевдонимов, чтобы помочь в сравнении.
command() { f=(**/filename.style); [[ ! -e $f ]] && f=fixed; /usr/bin/command "$f" "$@"; }
или:
command() { f=(**/filename.style); if [ ! -e $f ]; then f=fixed; fi; /usr/bin/command "$f" "$@"; }
Заключение
Во всех этих примерах command
может определить для $f
, проверить его действительность и присвоить соответствующий аргумент /usr/bin/command
, в то же время все еще в состоянии принять дополнительную командную строкуАргументы:
command arg1 arg2 arg3
Мы создали рабочие псевдонимы и функциональные функции, которые удовлетворяют требованиям.Сравнивая различия в реализации, соображения по обработке аргументов командной строки и хотя мы должны избегать дорогостоящих накладных расходов, все же можно добавить богатые функциональные возможности для псевдонимов и функций.
nJoy!