скорее, чем:

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

Часть 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):

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

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

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

(Кстати, разве «следующий персонаж, который следует» немного переборщил?)

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

 jarno11 июн. 2017 г., 13:25
@OlivierDulac 5 не обходит функцию, по крайней мере, в GNU bash 4.3.11
 harperville21 дек. 2016 г., 20:11
Это большой вопрос, но ни одно из объяснений, кажется, не проясняет какую-либо путаницу, которую я имею по этому вопросу. @ alexandros-gezerlis, если вы смогли понять причину, можете ли вы объяснить это мне (людям дома)?
 Olivier Dulac10 сент. 2013 г., 19:30
просто обратите внимание: 6-й отличается от первых 5: первые 5 обходят как функцию, так и псевдоним, тогда как\ls будет (в bash) только обходить псевдоним, а НЕ функцию с тем же именем. т.е.alias ls='echo "aliased"' ; function ls { echo "function" ; } ; ls ; \ls ; command ls : первая (ls) покажет «aliased», вторая (\ ls) обходит только псевдоним и, следовательно, показывает «функцию», а третья (команда ls) показывает вывод обычного ls

Ответы на вопрос(1)

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

cat << \EOF
this $text is fully quoted
EOF
 Alexandros Gezerlis28 мая 2011 г., 21:05
@geekosaur: извините, но я не понимаю, как это связано. Я не понимаю, как предложение, которое вы цитируете (обсуждаете случай, когда символы в слове не указаны) относится к вашему примеру, в котором первый символ в словеявляется в кавычках, что, вероятно, является причиной, по которой не происходит расширения параметров. Ваш пример также работает с E \ OF. Наконец, я до сих пор не понимаю, как все это выходит за рамки документов, особенно учитывая мою вторую цитату.
 Alexandros Gezerlis28 мая 2011 г., 18:48
Благодарю. Я отредактировал вопрос (первый абзац в части II), чтобы прояснить то, что я ошибочно считал очевидным: я был бы признателен за конкретную цитату.
 Alexandros Gezerlis28 мая 2011 г., 19:02
Кроме того, я только что заметил, что в POSIX 2.7.4 в здесь-документах явно указывается случай экранирования: «Если какой-либо символ в слове заключен в кавычки, разделитель должен быть сформирован путем выполнения удаления кавычки для слова». Однако в общем разделе о распознавании токенов (POSIX 2.3) четко указано, что здесь документы являются специальными: «Эти строки должны анализироваться с использованием двух основных режимов: обычное распознавание токенов и обработка документов здесь».
 Gordon Davisson29 мая 2011 г., 00:17
Случайное примечание: очевидно (по крайней мере, в оболочках, в которых я пробовал это), наличие пустой пары кавычек где-то в слове считается частью слова в кавычках (примеры:''ls, l""s, а такжеcat <<EOF'').
 geekosaur28 мая 2011 г., 20:05
@Alexandros: оба немного двусмысленны. Вы хотите прочитать немного дальше раздел 2.7.4, сразу после вашей первой цитаты: «Если в слове нет символов в кавычках, все строки документа здесь должны быть расширены для раскрытия параметров, подстановки команд и арифметического раскрытия. в этом случае обратная косая черта во входных данных ведет себя как обратная косая черта внутри двойных кавычек (см. Двойные кавычки). Однако символ двойной кавычки ('"') не должен обрабатываться специально в документе здесь, кроме случаев, когда двойная кавычка -квота появляется внутри "$ ()", "` `" или "$ {}". "

Ваш ответ на вопрос