Подтвердить что ты не робот

Почему обратная косая черта предотвращает расширение псевдонимов?

В первой части моего вопроса я предоставлю некоторую справочную информацию в качестве обслуживание сообщества. Вторая часть содержит фактический вопрос.

Часть I

Предположим, что я создал следующий псевдоним:

alias ls='ls -r'

Я знаю, как временно уналы (т.е. переопределять этот псевдоним) в следующем способами, используя:

1) полный путь к команде: /bin/ls

2) подстановка команды: $(which ls)

3) команда builtin: 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):

"Обратная косая черта, которая не цитируется, должна сохранить буквальное значение следующий символ, с исключение <newline> "

Bash Справочное руководство (3.1.2.1):

"Неконкретная обратная косая черта '\ является Bash escape-символ. Он сохраняет буквальное значение следующего характер, который следует, с исключение новой строки."

(BTW, не "следующий символ, который следует" немного перебор?)

Возможный ответ может заключаться в том, что эта ситуация не такая особенная: аналогично нескольким случаям в цитировании ANSI-C, например. \nnn. Однако это все еще избегая одного символа (восьмибитовый символ, значение которого является восьмеричным значение nnn), а не последовательность символов.

4b9b3361

Ответ 1

Исторически и поддерживается POSIX, цитируя любую часть слова, это означает, что все слова считаются цитируемыми для целей функций и расширения псевдонима. Это также относится к цитированию конечного токена для документа здесь:

cat << \EOF
this $text is fully quoted
EOF

Ответ 2

Просто для завершения, здесь еще один способ подавить псевдоним и поиск функций (очищая всю среду оболочки для одной команды):

# cf. http://bashcurescancer.com/temporarily-clearing-environment-variables.html
env -i ls

Ответ 3

\ls цитирует только первый символ, а не целое слово. Это эквивалентно написанию 'l' s.

Вы можете проверить это следующим образом:

$ touch \?l
$ \??
bash: ?l: command not found

Если \?? цитирует все слово, которое он сказал бы??? не нашел, а не? l не нашел.

То есть он имеет тот же эффект, что и:

$ '?'?
bash: ?l: command not found

скорее, чем:

$ '??'
bash: ??: command not found