Как я должен использовать цитирование с эхом в кукол?

Я не понимаю, зачем вы вставляете определения функций в псевдонимы. Ваш псевдоним 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

-1
20.09.2018, 19:52
4 ответа

Что происходит

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'

Дополнительная литература

2
28.01.2020, 05:07

Используйтеprintf:

printf '%s\n' 'PS1="[\t--------------------------------------------------------\n-\u@\h:\W]\$"' >> /home/unu/.bashrc
0
28.01.2020, 05:07

Вы можете просто использовать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 =>, но это будет иметь собственные проблемы с цитированием/экранированием.

0
28.01.2020, 05:07

Существует (как минимум )два уровня вещей, пожирающих ваших персонажей:

  1. оболочка
  2. 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 % "

1
28.01.2020, 05:07

Теги

Похожие вопросы