Я не понимаю, зачем вы вставляете определения функций в псевдонимы. Ваш псевдоним stash
определяет функцию, вызывающую f
, а затем немедленно вызывает ее таким образом, чтобы получить аргументы, переданные псевдониму. Для повседневного использования это эквивалентно определению функции с именем stash
:
function stash {
if (($# == 0)); then
git stash list;
else
git stash "$@";
fi;
}
По сравнению с тем, что указано в псевдониме:
stash функции {…}
или stash () {…}
для определения функции. Они эквивалентны, за исключением того, что если вы уже определили псевдоним с именем stash
, он будет расширен при попытке определить функцию, поэтому определение не будет делать то, что вы хотите. . При определении функции либо убедитесь, что имя функции еще не определено как псевдоним, либо используйте синтаксис function
. (($ # == 0))
, чтобы проверить, есть ли у функции какие-либо аргументы, а не проверять, пуст ли первый аргумент. Намерение яснее. (И это позволяет использовать пустой аргумент, но здесь это все равно не имеет смысла.) "$ @"
вместо "$ 1"
при вызове git. «$ @»
передает все аргументы функции. Вы можете поместить определения функций в то же место, что и определения псевдонимов: в вашем .bashrc
, в .bash_aliases
или в другом файле, источником которого является .bashrc
, например
. ~/lib/git-functions.bash
command => "/usr/bin/echo -e 'PS1="[\\t--------------------------------------------------------\\n-\\u@\\h:\\W]\\$"' >> /home/unu/.bashrc"
Понимание того, где что-то идет не так, является ключом к тому, чтобы сделать все правильно. Правая часть -элемента после =>
должна быть строкой. Строки в Puppet имеют несколько форм. Строка в двойных -кавычках начинается с двойных кавычек и заканчивается вторым набором. Таким образом, ваша строка
"/usr/bin/echo -e 'PS1=". Затем за ней следует тарабарщина, которая синтаксически неверна для манифеста:
[\t--------------------------------------------------------\n-\u@\h:\W]\$и другая строка:
"' >> /home/unu/.bashrc"
Создайте правильную настройку снизу вверх. Начните с того, что вы хотите, чтобы команда выводила в этот файл. Вывод представляет собой команду оболочки, которая устанавливает для переменной оболочки PS1
значение :
[\t--------------------------------------------------------\n-\u@\h:\W]\$. Такая команда, использующая одинарные кавычки (, предпочтительнее, чем двойные кавычки, потому что она не требует экранирования для этих символов
\
и $
. )чтобы остановить экранирование escape-последовательностей оболочкой:PS1='[\t--------------------------------------------------------\n-\u@\h:\W]\$'Вы можете вывести такую команду с
echo
вызванной оболочкой (точкой, к которой мы вернемся к ), но вы должны убедиться, что с больше экранирования, что одинарные кавычки достигают команды echo
:echo PS1=\''[\t--------------------------------------------------------\n-\u@\h:\W]\$'\'
Однако это имеет проблемы с тем фактом, что echo
не имеет согласованного поведения на разных платформах и оболочках, и (по иронии судьбы )его возможное преобразование escape-последовательностей на самом деле не то, что вы хотите. Действительно, несмотря на тег в вашем вопросе, оболочка, выполняющая команду, не обязательно должна быть оболочкой Bourne Again, в зависимости от операционной системы (, которую вы не указали ). Например, это может быть оболочка Debian Almquist. Для лучших результатов используйтеprintf
:
printf "PS1='%s'\n" '[\t--------------------------------------------------------\n-\u@\h:\W]\$' >> /home/unu/.bashrc
Обратите внимание, что до сих пор предполагалось, что это командная -строка, переданная оболочке для выполнения.Экранирование и заключение в кавычки аргументов, переданных в echo
и printf
, чтобы они в конечном итоге имели правильное содержимое, соответствует правилам оболочки. Так что обратите внимание на комментарий к вопросу, в котором говорится о провайдерах.
Теперь вам нужно закодировать это в строке Puppet. Одиночные -строки в кавычках снова являются лучшим выбором, так как вам нужно экранировать только символы '
и \
(, что не совсем совпадает с правилами оболочки для одиночных -строки в кавычках, примечание):
command => 'printf "PS1=\'%s\'\\n" \'[\\t--------------------------------------------------------\\n-\\u@\\h:\\W]\\$\' >> /home/unu/.bashrc'
Используйтеprintf
:
printf '%s\n' 'PS1="[\t--------------------------------------------------------\n-\u@\h:\W]\$"' >> /home/unu/.bashrc
Вы можете просто использоватьcat
:
cat /var/tmp/ps1-file >> /home/unu/.bashrc
ps1-file
можно создать вручную (с помощью предпочитаемого вами редактора ), чтобы избежать проблем с экранированием в bash
/ echo
/ printf
. Чтобы этот файл достиг узла, вам нужно добавить раздел файла .
file { "/var/tmp/ps1-file"
source => 'puppet:///modules/bashrc/ps1'
}
Это означает размещение исходного файла в modulepath
. Поскольку его содержание представляет собой небольшой объем текста, вы могли бы указать его с помощью content =>
, но это будет иметь собственные проблемы с цитированием/экранированием.
Существует (как минимум )два уровня вещей, пожирающих ваших персонажей:
echo
себя Если вы запустите:
echo "hello, \"world\""
вы получите результат
hello, "world"
, потому что оболочка съела двойные -кавычки в обратной косой черте, а не эхо. Оболочка восприняла их как синтаксис оболочки, означающий передачу hello, "world"
для эха в качестве одного аргумента. Какое эхо затем печатается плюс новая строка.
echo -e
особенно интерпретирует последовательности обратной косой черты (в зависимости от реализации ); простое решение этой проблемы — использовать printf '%s\n' WHATEVER
вместо echo WHATEVER
.
По большей части вы можете защитить что-либо от оболочки с помощью одинарных -кавычек (, если они не содержат одинарных -кавычек ). Итак, вам может понадобиться:
printf '%s\n' 'PS1="[\t--------------------------------------------------------\n-\u@\h:\W]\$"'
, что дает:
PS1="[\t--------------------------------------------------------\n-\u@\h:\W]\$"
Если вам нужно пережить экранирование нескольких слоев оболочки -, вам может пригодиться printf '%q\n' WHATEVER
, который печатает его в формате, позволяющем пережить оболочку (, но это может быть только функция Bash -, не проверял ).
BTW :Если вам нужно защитить одну кавычку -внутри одной строки в кавычках -, вы должны сделать что-то вроде'\''
:
$ printf '%s\n' 'i'\''ll'
i'll
, что, если внимательно присмотреться, на самом деле 'i'
+ \'
+ 'll'
.
PS:PS1
подвергается другому расширению (см. документацию Bash ); вы, очевидно, знаете о таких, как \u
. Но переменные также расширяются — поэтому, если у вас есть что-то после $
в конце, вам нужно будет экранировать его (с тремя обратными косыми чертами, если внутри строки в двойных -кавычках):PS1="foo\\\$PATH % "