Я часто использую git commit -F- <<EOF, чтобы записать EOF-терминированную строку в качестве сообщения фиксации.

С помощью

alias commitml="git commit -F- <<EOF"

Работает как задумано.

Однако я хотел бы иметь возможность передавать аргументы.

Итак, я хотел определить в своем .bashrc:

commitml() {
   git commit $* -F- <<EOF
}

Который возвращается как ошибка, когда source()ing:

bash: предупреждение: здесь-документ в строке 6, разделенный концом файла (требуется `EOF') bash: /home/yannick/.bashrc: строка 8: синтаксическая ошибка: неожиданный конец файла

Можно ли как-то избежать <<, чтобы он работал так же, как в псевдониме?

1
Kamil Maciorowski 20 Апр 2021 в 16:43

1 ответ

EOF оценивается, когда функция определена; конечно, Bash пропускает остальную часть скрипта, пока не найдет соответствующий терминатор EOF.

То, что вы похоже, ищете, — это способ использования стандартного ввода через конкретный токен. Обычный способ сделать это — просто напечатать ваше сообщение и закончить его нажатием ctrl-D (или любым другим способом, который настроен на вашем терминале для сигнализации о конце файла).

commitml() {
   git commit "$@" -F-
}

Вы можете использовать это как commitml <<EOF, если хотите, конечно; или, возможно, переименуйте функцию в _commitml и установите

alias commitml='_commitml <<EOF'

Это один из немногих допустимых вариантов использования псевдонима над функцией — текст внутри одинарных кавычек оценивается только тогда, когда вы действительно используете псевдоним. Любые токены после commitml будут переданы в "$@" (обратите внимание на использование этой правильно заключенной в кавычки переменной вместо ошибки цитирования $*).

4
tripleee 8 Апр 2021 в 10:20