Почему grep не возвращает то, что я ожидал, когда я использую одинарные кавычки

AFAIK, запуск X всегда автоматически переключается на виртуальный терминал, который использует этот X-сервер. Никогда не требуется вручную переключаться на VT при запуске X.

В Debian 8 с systemd вы должны обнаружить, что X запускается на следующем свободном VT. Если вы вошли в систему на tty1 и еще не переключились на tty2, tty2 был бы бесплатным. [*] (Ctrl + alt + F2).

Причина, по которой ctrl + alt + f7 абсолютно ничего не делала, заключается в том, что VT7 полностью не использовался. Это просто то, что происходит, если вы пытаетесь переключиться на полностью неиспользуемый VT.

Если вы не уверены, я думаю, вы можете использовать привилегии root (например, sudo), чтобы узнать, какой номер VT использует X-сервер. Найдите идентификатор процесса X с помощью pgrep X , например. 100, затем sudo lsof -p 100 . Или наоборот: sudo lsof / dev / tty [0-9] *


В более современной системе, такой как Fedora Linux, вы должны обнаружить, что X работает на той же ] VT, из которого был запущен startx .X-сервер не может захватывать или переключать виртуальные машины, потому что он больше не работает как root .

[*] Systemd ведет себя иначе, чем предыдущая система инициализации: она запускает текстовое приглашение на вход в VT (с VT1 на VT6) только тогда, когда вы фактически переключаетесь на него. До systemd запросы входа в систему запускались на всех 6 VT во время загрузки. Следовательно, оставив VT7 для запуска X (ctrl + alt + f7). (Кроме того, можно снова освободить VT с помощью sudo systemctl stop getty @ tty2 :).

1
19.12.2016, 00:44
3 ответа

Ну, вы знаете, что шаблон поиска содержит "-", и вы знаете, что, когда шаблон поиска содержит "-", вам нужно использовать флаг -e . Поскольку вы не используете флаг -e , оболочка вместо этого интерпретирует ваш «шаблон» как аргумент (и параметр). Вы можете увидеть это с помощью:

$ grep "-foo" file1
grep: oo: No such file or directory

По расширению ваш код grep "-example" file1 сообщает оболочке, что вы хотите запустить grep с -e аргумент и параметр «xample».

Это та же проблема, с которой мы сталкиваемся, когда пробуем что-то вроде rm -my-silly-file-name - это не сработает, и нам нужно использовать что-то вроде rm. / -мое-глупое-имя-файла вместо этого. Другой способ обхода - rm - -my-silly-file-name . Мы можем использовать эту идиому здесь:

$ grep -- "-example" < file1
-example

Знак «-» сообщает оболочке, что все, что идет после него, не является аргументом.

В качестве альтернативы, вы можете просто экранировать "-" знаком "\", как вы видели:

grep "\-example" file1

В этой статье подробно рассказывается о цитировании : соответствующая часть - Параметры и обратные кавычки Команды, которые должна интерпретировать оболочка, заключаются в двойные кавычки. Когда вы используете двойные кавычки, содержимое интерпретируется оболочкой.

3
27.01.2020, 23:13

Аргумент, который начинается с - , принимается как опция.

В ваших первых двух случаях первый аргумент, переданный в grep , - это -example , который grep понимает как -e xample ( xample аргумент для параметра -e , поэтому ищите xample ).

В третьем случае \ - пример передается в grep . Поскольку он не начинается с - , он не рассматривается как вариант. Вместо этого он используется как регулярное выражение. Однако поведение для \ - не определено согласно POSIX, поэтому у вас нет гарантии, что оно соответствует. В большинстве реализаций grep \ - будет соответствовать - , однако вы можете представить себе реализации grep , где \ - ] может быть специальным оператором (см., например, GNU grep , где \ + - специальный оператор и не соответствует литералу + ).

Если вы хотите, чтобы -example не использовался как опция, вам потребуется либо:

  • grep - -example file . - обозначает конец параметров. Все, что находится после него, не является опцией (поэтому первый аргумент - это шаблон для поиска, а остальные - список файлов для поиска).
  • grep -e -example файл . Здесь -example используется в качестве аргумента опции -e .

Вот почему вам следует привыкнуть писать:

grep -e "$pattern" file

Или

grep -- "$pattern" file

, если вы не можете гарантировать, что $ pattern не будет начинаться с - .

Обратите внимание, что здесь вы также можете написать это:

grep '[-]example' file

Хотя см. Выражение в скобках (без диапазонов), соответствующее неожиданному символу в bash , о возможных осложнениях с этим подходом.

2
27.01.2020, 23:13

Вы «знаете, если шаблон [начинается с] '-', то следует использовать опцию -e», но вы не используете ее, когда должны. grep -e -example file1 даст вам ожидаемый результат.

Вот что на самом деле выполняется в каждом из ваших примеров:

  • grep -example file1 => grep -e xample file1 (-e is necessary)
  • grep '-example' file1 => grep -e xample file1 (-e is necessary)
  • grep "-example" file1 => grep -example file1 (-e не требуется)
2
27.01.2020, 23:13

Теги

Похожие вопросы