значение «» (апостроф) в терминальных командах

11

По какой-то странной причине я попытался использовать «» в качестве разделителя слов в идентификаторах, например:

$ export foo'bar=1
> 
> ^C
$ 

В результате , как показано выше, идентификационные EST на быстрые изменения «>» и система , очевидно , ожидает получения дополнительной информации о моей стороны. Как видите, мне пришлось нажать Ctrl-C, чтобы сбежать. То же самое происходит с использованием других команд, таких как

$ ls foo'bar
$ mkdir foo'bar

Меня интересует смысл всего этого, вот что имеет особое значение "" "в терминальных командах (настолько особенное, что оно разбирается даже внутри идентификаторов).

Дополнительно: кроме того, я также хотел бы знать набор специальных или иных недопустимых символов в именах файлов и папок, как в Unix-подобных системах, так и в системах Windows (чтобы получить общее подмножество безопасных) (в частности, как насчет всех не-ASCII?).

Спасибо денис

Денис 63
источник
В мире Linux разрешены все символы, кроме \ 0 (null) и /. Тем не менее, это не значит, что они все желательны. Многие считают, что лучше избегать символов, которые имеют особое значение для оболочки. Если вы хотите узнать о Windows, обратитесь к справке по Windows.
Скотт Северанс

Ответы:

15

Символ 'является очень мощным символом, когда используется в любой команде оболочки. В основном '(знаки апостроф) отключает все виды преобразований или модификаций. Он рассматривал бы все, что заключено в метки, как единый объект, то есть как один параметр. Абсолютно никакой замены или расширения не произойдет.

Пример:

 $ echo '$HOME'

выдаст на выходе $HOMEсаму строку и не выведет путь к вашему домашнему каталогу. Поскольку одинарные кавычки предотвращают любое расширение, подстановка и простое рассматривает все, что присутствует, как простой параметр сам по себе.

Если вы хотите использовать апостроф как есть, вы должны избежать его:

 $ mkdir foo\'bar

 $ cd foo\'bar

Если он не экранирован, он будет ждать закрытия своей пары, как это произошло в вашем первом примере.

Итак, исправлено, ваша команда будет:

 $ export foo\'bar=1

ПРИМЕЧАНИЕ. Как заметил Милан Тодорович, это будет недействительно, поскольку в этом случае нельзя использовать апостроф.

Frantique
источник
1
@ denis63, пожалуйста, примите ответ, если это то, что вам нужно было увидеть :)
Rinzwind
7

Персонаж '- это особый характер. Вы используете его, чтобы отметить часть записи командной строки, которая не будет изменена (например, без замены подстановочных знаков). Например:

$ ls 'bla*'
ls: cannot access bla*: No such file or directory

Это означает, что аргументом lsбыло bla*и не все, что начинается с bla.

Причина, по которой вы получаете >символ, заключается в том, что вы должны использовать один 'для открытия и один 'для закрытия части, которая не будет изменена.

Если вы хотите использовать 'в папке имен вы должны экранировать его так: \'. Так что если вы хотите перечислить папку с именем, foo'barвы должны напечатать ls foo\'bar.

О, и я не уверен, возможно ли использовать 'в именах переменных среды. Я думаю, что вы не можете использовать export foo\'bar=1,

Надеюсь это поможет.

Милан Тодорович
источник
Upvote для вашего наблюдения об ограничении имен переменных среды.
Frantique
Пока не могу проголосовать (плохо знаком с Askubuntu), но чувство есть. Проверил насчет env var names, все так же, как вы говорите (Я чувствую себя немного глупо, что сам не думал об открытии / закрытии разделителей, но потом я считал «» настоящим апострофом, а не одиночной кавычкой). Денис
63