Использовать имя файла в качестве аргумента в псевдониме bash, по умолчанию, если оно не существует - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь создать псевдоним для команды с аргументом, который может быть либо именем файла, либо строкой:

command --style filename.style

ИЛИ

command --style "fixed"

Есть лиспособ объединить это в одну строку, где у меня есть параметр стиля, определенный с чем-то вроде:

command --style {`find . -name "filename.style"` || "fixed"}

Ответы [ 2 ]

1 голос
/ 05 июня 2019
  1. Мотивы и мотивы

@ 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!

1 голос
/ 27 мая 2019

Псевдонимы здесь не так хороши, как функции, так как у них нет поддержки логики ветвления (без прыжков через обручи, которые, по сути, в любом случае назначают вам функцию).Лучше просто сделать код функцией напрямую:

foostyle() {
  if [[ -e filename.style ]]; then
    foo --style filename.style "$@"
  else
    foo --style fixed "$@"
  fi
}

... заставит foostyle whatever выполнить foo --style filename.style whatever, если в текущем рабочем каталоге существует filename.style, или foo --style fixed whatever в противном случае.

Насколько я могу судить, это то, что вы просите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...