В первой части моего вопроса я предоставлю некоторую справочную информацию в качестве услуги для сообщества.Вторая часть содержит актуальный вопрос.
Часть I
Предположим, я создал следующий псевдоним:
alias ls='ls -r'
Я знаю, каквременно снять (то есть переопределить этот псевдоним) следующими способами, используя:
1) полный путь к команде: /bin/ls
2) подстановка команды: $(which ls)
3) встроенная команда: command ls
4) двойные кавычки: "ls"
5) одинарные кавычки: 'ls'
6) символ обратной косой черты: \ls
Случай 1 очевиден, а случай 2 - просто вариант.Встроенная команда в случае 3 была разработана для игнорирования функций оболочки, но, очевидно, она также работает для обхода псевдонимов.Наконец, случаи 4 и 5 согласуются как со стандартом POSIX (2.3.1) :
"результирующим словом, которое идентифицируется как слово имени команды простогоКоманда должна быть проверена, чтобы определить, является ли это действительным псевдонимом без кавычек. "
и Справочное руководство Bash (6.6) :
«Первое слово каждой простой команды, если оно не заключено в кавычки, проверяется на наличие псевдонима».
Часть II
Вот вопрос:почему случай 6 (перекрывающий псевдоним, сказав \ls
) считается цитированием слова?В соответствии со стилем этого вопроса, я ищу ссылки на «официальную» документацию.
В документации говорится, что обратный слеш экранирует только следующий символ , в отличие от одиночного идвойные кавычки, которые цитируют последовательность символов. Стандарт POSIX (2.2.1) :
"Обратная косая черта, которая не указана в кавычках, должна сохранять буквальное значение следующего символа, за исключением "
Справочное руководство Bash (3.1.2.1) :
"Обратная косая черта без кавычек" \ "является escape-символом Bash. Она сохраняетбуквальное значение следующего последующего символа, за исключением символа новой строки. "
(Кстати, разве" следующий символ, который следует "немного лишнее?)
Возможный ответ может заключаться в том, что эта ситуация не такая уж особенная: она похожа на несколько случаев в цитировании ANSI-C, например \nnn
.Тем не менее, это по-прежнему экранирует один символ (восьмибитный символ, значение которого является восьмеричным значением nnn), а не последовательность символов.