Почему обратные слэши предотвращают расширение псевдонимов? - PullRequest
23 голосов
/ 28 мая 2011

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

Часть 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), а не последовательность символов.

Ответы [ 3 ]

5 голосов
/ 30 мая 2011

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

# cf. http://bashcurescancer.com/temporarily-clearing-environment-variables.html
env -i ls
5 голосов
/ 28 мая 2011

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

cat << \EOF
this $text is fully quoted
EOF
0 голосов
/ 13 апреля 2018

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

Вы можете проверить это так:

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

Если \ ?? процитировал это слово в целом? не найден, а не? Я не найден.

т.е. имеет такой же эффект как:

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

вместо:

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