Терминал показывает> после ввода \

Ответы:

35

Всякий раз, когда вы используете командную строку, может быть случай, когда вам нужно выполнить очень длинную команду. Итак, вы хотите разделить команду на несколько строк для лучшей читаемости и понимания. Но если вы используете символ новой строки, который набирается Enter, оболочка будет думать, что это новая команда. Таким образом, вы используете \символ новой строки.

По сути, команды или скрипты bash «интерпретируются», то есть выполняются построчно. Каждая новая строка означает начало новой команды. В терминале, когда вы нажимаете Enter, вы получаете запрос на запуск новой команды. Итак, новая строка должна быть "экранирована". Ввод с \последующим Enterпозволяет разделить текущую команду на несколько строк, чтобы оболочка не думала, что это новая команда, а является продолжением предыдущей команды.

> это не что иное, как подсказка для следующей строки вводимой команды.

Например:
если мы хотим установить несколько пакетов, команда будет выглядеть так:

$ sudo apt install [package1] [package2] [package3] ...

Но иногда это мешает команде. Таким образом, мы можем использовать с \последующим Enter(символ новой строки)

$ sudo apt install [package1]\
> [package2]\
> [package3]\
> ...
Kulfy
источник
4
@Curiouskangaroo Кстати, вы можете контролировать , как новая команда и продолжение строки подсказки работы, устанавливая значения к $PS1и $PS2переменным. См. Справочную страницу bash, чтобы узнать формат, и используйте echo "'$PS2'"для просмотра текущих настроек.
jpaugh
14

Символ обратной косой черты ( \) используется в качестве escape-символа в оболочке. Если вы используете его как последний символ в строке, он экранирует символ новой строки, поэтому вы можете продолжить свою команду на следующей строке вместо завершения. На это указывает >подсказка в Bash.

Пример:

$ echo A\
> B
AB
$

Чтобы вставить литерал \в вашу команду, вы должны экранировать его, используя другую обратную косую черту:

$ echo \\
\
$
Melebius
источник
7

[добавляя (слишком длинный / сложный) ответ, так как другие 2 не упоминают, как выглядит «>» ... т.е. не упоминают PS2]

Введено: \Enter: \говорит оболочку , чтобы только выходEnter как literral характер , а не интерпретировать его как обычно (Поэтому оболочка «переходит к следующей строке» вместо завершения текущей командной строки и его интерпретации Если вы не в некоторых. другие конструкции, такие как heredoc, цикл for и т. д.).

Таким образом, ваш терминал интерпретируется \Enterкак: «перейти к следующей строке» (без начала интерпретации команды), и, таким образом, терминал теперь позволяет вам вводить вторую строку многострочной команды и, чтобы сделать ее более видимой, отображает $PS2содержимое ( называется PS2 подсказка ) на каждой последующей строке.

PS2 переменные обычно определяемся по умолчанию как: PS2="> "и вы можете для Exemple редактировать свои ~ / .bashrc , чтобы переопределить его , как вы хотите (принимая во внимание , что он должен, им, избегать содержащий опасные символов, таких как >или ;, и должен помочь вам либо ясно видеть , что это многострочные команды , но отключить его многострочное содержание (например: PS2="#cont#") или позволяете легко копировать / вставлять их с минимальным воздействием на его линии , как это возможно (например: PS2=" ")

Что, кстати, по моему мнению, плохое значение по умолчанию, поскольку в некоторых случаях это может привести к удалению некоторых важных двоичных команд.

Вы можете переопределить PS2 как нечто другое (мне нравится: PS2 = "", например), чтобы многострочные команды можно было легко копировать / вставлять, не опасаясь следующего:

Например, скажем, у вас есть команда, которая начинает быть очень длинной (и может сворачиваться на вашем экране, если ваш терминал недостаточно широк):

grep -i "something"  /some/file  /another/file /3rd/file /etc/someimportantfile 

Если команда выглядит слишком длинной (и оборачивается), вы можете визуально разделить ее на 2 строки, выбрав, где (когда) вы хотите перейти к следующей строке, вставив: \Enterв соответствующем месте:

grep -i "something"  /some/file  /another/file /3rd/file \
> /etc/someimportantfile #warning, "> " was inserted by the shell and this changes everything !

Используя PS2 по умолчанию, оболочка добавила «>» перед «/ etc / someimportantfile» .. поэтому, если вы скопируете / вставите эти 2 строки в другой терминал, их действие будет совершенно другим: вместо поиска в 4 файлах grep только входя в первые 3 файла, и вывод grep заменяет содержимое 4-го файла (/ etc / someimportantfile)!

Чтобы избежать этих проблем (и многих других): вы можете, например, определить: PS2=" "сделать многострочные команды более понятными и их легче копировать / вставлять:

grep -i "something"  /some/file  /another/file /3rd/file \
  /etc/someimportantfile #now only 2 spaces were inserted, without changing the grep's actions!

Обратите внимание, что эта команда время / bin / some просто сдвигает 2 пробела вправо, и «>» не было вставлено, так что вы можете спокойно скопировать / вставить эту 2-строчную команду.

PS2 также используется в циклах «for», «while» и т. Д., И его определение как «», на мой взгляд, лучше и в тех.

Оливье Дюлак
источник