как использовать управляющие символы в определении псевдонима bash - PullRequest
0 голосов
/ 17 апреля 2020

У меня проблема с определением псевдонима в bash.

Я пишу псевдоним как:

alias mypr="enscript -jC -p output.ps -b '$n %W Page $% of $='"

Но когда я набираю псевдоним mypr, я получаю это ($ n исчезает, и появляются дополнительные цитаты):

alias mypr='enscript -jC -p output.ps -b '\'' %W Page $% of $='\'''

Я попытался посмотреть на ответ по номеру 53398792 , но не могу понять, какую ошибку я совершаю. Предложения, пожалуйста?

Ответы [ 3 ]

2 голосов
/ 17 апреля 2020

Избегайте использования alias определений для чего-либо, кроме действительно простых сочетаний клавиш, например, alias cdw="cd /home/users/foo/bar/workspace". Для всего, что включает в себя более чем одну командную конструкцию или аргументы, кавычки всегда предпочитают функции, а не псевдонимы

Ваш вариант функции может быть просто записан, как показано ниже. Это на 100% переносимо в любой оболочке Unix и может быть добавлено в файл запуска, ваша оболочка использует

mypr() {
    enscript -jC -p output.ps -b '$n %W Page $% of $='
}

Определение псевдонима не сработало, потому что оболочке не понравился способ ваш $ персонаж обработан. Право, когда вы определяете псевдоним как "..", при разрешении определения псевдонима он пытается раскрыть содержимое в кавычках, как часть, для которого он выполняет расширение переменных. Таким образом, любой токен, содержащий префикс $, перед которым раскрывается, оболочка пытается развернуть $n и не видит значения, поэтому она сохраняет пустую строку.

Чтобы избежать этого, вы должны иметь либо вы определили свой псевдоним внутри одинарных кавычек '..', либо экранировали все токены $, чтобы они не разрешались во время определения. Поскольку $% и $= не являются какой-либо специальной переменной оболочки или пользовательскими переменными, они не раскрываются и обрабатываются буквально.

Итак, на нашем первом этапе экранирования мы добавляем одну escape () на $n и определите его следующим образом:

alias mypr="enscript -jC -p output.ps -b '\$n %W Page $% of $='"

Вы сразу увидите, что теперь вы сохранили $n, но потеряли внешние кавычки '..' как часть удаления цитаты, так что вы теперь вам нужно избегать этого

alias mypr="enscript -jC -p output.ps -b \'\$n %W Page $% of $=\'"

При вызове псевдонима вы обнаружите, что даже вышеперечисленное не работает, поскольку оболочке все еще удалось развернуть $n. Так что вам нужно будет ввести еще один уровень побега и побега.

alias mypr="enscript -jC -p output.ps -b \'\\\$n %W Page $% of $=\'"
1 голос
/ 17 апреля 2020

$n расширен в " кавычки. Поскольку, скорее всего, переменная n пуста, она расширяется до нуля. Escape it.

alias mypr="enscript -jC -p output.ps -b '\$n %W Page \$% of \$='"

Или используйте одинарные кавычки:

alias mypr='enscript -jC -p output.ps -b '\''$n %W Page $% of $='\'

Или просто используйте функцию:

mypr() { enscript -jC -p output.ps -b '$n %W Page $% of $=' "$@"; }
0 голосов
/ 17 апреля 2020

попробуйте что-то вроде этого

alias mypr="enscript -jC -p output.ps -b \'"'\$n %W Page \$% of \$='"\'"

Я проверил этот более простой случай:

# this outputs '$2'
alias tt="echo \'"'\$2'"\'"

Итак, я избежал всех знаков доллара и поместил их в одинарные кавычки строка и кавычки также избегают их, но помещают их в строку с двойными кавычками

Идея состоит в том, что вы можете склеивать последовательности, так что у вас может быть что-то вроде "lala"'blabla', и оно будет прекрасно работать

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