Почему там обратная косая черта '\' разрывы строки на этой способной команде установки?

Когда я читаю учебные руководства, которые требуют установки многих пакетов, они будут часто представлять обратную косую черту \ в конце строки?

sudo apt install gcc git pkg-config meson ninja-build \
                 libavcodec-dev libavformat-dev libavutil-dev \
                 libsdl2-dev

Почему? Когда я копирую, вставляют команду в мой терминал Linux, это никогда не работает, и я должен удалить обратные косые черты и поместить все на одну строку. Что продолжается?

12
задан 3 January 2020 в 01:10

4 ответа

\ символ в конце строки интерпретируется как символ продолжения строки в ударе, который говорит удару ожидать продолжение команды на следующей строке если:

  • \ символ является частью строки, которая включается символами одинарной или двойной кавычки
  • или \ символа оставляют путем помещения другого символа обратной косой черты перед ним как это \\ который делает, это интерпретировало как буквенный символ.

Примечание: Незаключенная в кавычки обратная косая черта \ также используется в качестве символа ESC в ударе.

Копирование/вставка нескольких выравнивает команду как ниже примера из текстового редактора в терминальные результаты в команде, выполняемой как однострочная команда.

Исходный текст:

touch 1 \
2 \
3 \
&& ls

Исходный текст копирует/вставляет в терминал:

$ touch 1 \
> 2 \
> 3 \
> && ls
1  2  3

Когда следующее, несколько выравнивают команду, копируют/вставляют с текстового редактора в терминал, она приводит к распечатанным символам обратной косой черты. Обратные косые черты интерпретируются как литеральные символы обратной косой черты в этой команде, потому что они включаются в пару (единственных) символов кавычки.

Исходный текст:

echo 'This is \
a multiple line \
command.'

В терминале:

$ echo 'This is \
> a multiple line \
> command.'
This is \
a multiple line \
command.

Все команды в этом ответе были первоначально введены мной в текстовом редакторе прежде, чем вставить их в терминал, таким образом, нет никаких невидимых символов в командах, которые могли заставить команды не работать.

10
ответ дан 11 January 2020 в 09:46

Обратная косая черта используется ударом для указания на продолжение строки и наиболее часто используемая в сценариях удара. Однако обратная косая черта является на самом деле символом ESC удара. Таким образом, это использование обратной косой черты 'выходит' из \newline для создания продолжения. Прохладный, и хороший для знания, а? В частности, Раздел 3.1.2.1 из GNU колотит руководство, говорит:

Незаключенная в кавычки обратная косая черта ‘\’ является символом ESC Bash. Это сохраняет литеральное значение следующего символа, который следует, за исключением новой строки. Если \newline пара появляется, и сама обратная косая черта не заключается в кавычки, \newline рассматривают как продолжение строки (то есть, это удалено из входного потока и эффективно проигнорировано).

Отвечать на Ваш конкретный вопрос: автор просто указывает, что многострочное выражение является однострочной командой удара. Это многострочное выражение будет работать, если не будет никаких символов после '\', но \newline. Однако, если Вы вырезаете и вставляете, могут быть все виды хлама (например, пробелы) после '\'. Так, или удалите все конечные символы после '\' или просто поместите команду на одну строку, как Вы делали. Я часто нахожу использование '\' удобным при вводе долгой команды, но это - вопрос персонального предпочтения.

18
ответ дан 11 January 2020 в 09:46

\ символ продолжения строки в sh / bash точно так же, как в C (для #defining долгий макрос) или несколько других языков программирования, позволяя переносящий длинные линии в источник, не изменяя значение на ориентированном на строку языке.

Это Просто Работает с единственной вставкой, если выбор не включает пробелов после \ символы, только новая строка. (В Хроме, который обнаруживается как одно синее символьное "поле", которое похоже на пространство в конце строки, но по-видимому это - на самом деле новая строка.) Некоторые веб-страницы включают конечные пробелы в свой форматировавший код. Возможно, автор копирует/вставляет с терминала включая, растягивает к фиксированной ширине и не очищал его для их блока кода.

Можно сказать это визуально путем выбора всего этого и рассмотрения окончаний строки. Если это хорошо, можно просто вставить в терминал. В противном случае можно вставить в редактора и выйти из строя \ ... spaces newline самостоятельно.

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

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

Хром, по крайней мере, позволяет Вам корректировать свой выбор с shift+left/right стрелкой при наличии затруднений при получении всех символов, Вы хотите с мышью, но не символами, которые Вы не хотите.


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

# Good: 
echo 1 \
     2 \
     3 

# Bad: spaces after backslash: needs editing to copy/paste
echo 1 \     
     2 \    
     3 

результат вставки: \ только выходит из пространства, не новой строки. Отдельные строки - каждый безопасный самостоятельно, таким образом, безопасно играть вокруг с. Не как a rm * это, как предполагается, является частью чего-то еще, или запускающий любые реальные программы, если Вы не имеете псевдонимы или окружаете вызванные функции 2 или 3'.

peter@volta:/tmp$ echo 1 \     
1  
peter@volta:/tmp$      2 \    
bash: 2: command not found
peter@volta:/tmp$      3 
bash: 3: command not found

Один быстрый способ зафиксировать, не запуская отдельного редактора:

Вставка в одинарных кавычках:

$ 'echo 1 \     
>      2 \    
>      3 '
bash: $'echo 1 \\     \n     2 \\    \n     3 ': command not found

Отметьте тот используемый удар $'C-escaped' синтаксис для заключения в кавычки команды назад мне. Я действительно на самом деле поражал возврат для получения всего этого в историю командной строки. Редактирование строки Bash не вернется к предыдущей уже отправленной строке, но мультилинии, заключенные в кавычки вещи действительно создают единственную многострочную запись истории.

Стрелка вниз оттуда дает мне все это как единственная команда со встроенными новыми строками, которые можно отредактировать. Необходимо удалить их, или это будет все еще интерпретироваться как несколько команд, как то, если они были ; точки с запятой. Также, конечно, удалите ' кавычки.

Ctrl-w (unix-word-rubout) обработки \ как "слово" и остановки после него. (В отличие от M-d, которого (оставляют) для удаления вперед слова или M-клавиши-Backspace (удалите назад слово); они удалили бы слово мимо обратной косой черты). Ctrl-w даже рассматривает новую строку как "слово" (который является на самом деле не, что мы хотим; от первого непробельного символа мы хотели бы просто уничтожить к \ на предыдущей строке).

ctrl-left (или escape-f) / ctrl-right (или escape-b) перемещает курсор целыми словами, таким образом, можно быстро добраться до запуска "строки" для управления-w. Или ctrl-r для инвертирования i-поиска \ может получить Вас там, затем ctrl-right + оставленный добраться до первого слова следующей строки.

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

При использовании удара / readline редактирование строки регулярно Вы будете уже помнить многие из этих команд. Я упоминаю их здесь только в пользу людей с меньшим опытом с редактированием строки удара, которые могли бы думать, что это стоило копии/вставки в редактора и затем в удар. Это - конечно, опция, особенно если у Вас есть редактор, уже открываются.


Другой возможно полезная команда редактирования является M-\(meta/escape обратная косая черта). Это удаляет пробел, окружающий курсор. Вы могли просто использовать это дважды с курсором после \ на, для отъезда его как многострочной вещи с \ продолжения. Например, повторно вызовите команду со стрелкой вниз

  • возвратитесь / ctrl-a / удаляет (или ctrl-d) для удаления одинарных кавычек
  • ctrl-s вперед i-поиск \, затем стрелка вправо (или ctrl-f), чтобы перейти курсор на пространство после \
  • Escape -\. (Или высокий звук -\ если Ваш терминал правильно настраивается, чтобы это работал emacs строка, редактирующая мета - обычно путем отправки префикса Escape.)
  • ctrl-s ctrl-s для передачи i-поиска того же самого снова
  • повторите, что стрелка вправо + уничтожает пробел

(Я не предлагаю запомнить эти шаги, это - всего один способ использовать редактирование строки, чтобы сделать задание.)

Или можно удалить \ и новая строка (и пробел коллапса вниз к 1 пространству, если Вы хотите), как я предложил с управлением-w. Удалите / ctrl-d или клавиша Backspace удалят новую строку или обратную косую черту, когда у Вас будет курсор в правильном месте. Редактирование строки Bash, по-видимому, не имеет emacs M-space для сворачивания пробела к 1 (вместо 0) пробелы но можно сделать это вручную с M-\ + пространство.

7
ответ дан 11 January 2020 в 09:46

Когда Вы копируете текст с веб-страницы, отформатированной как это:

sudo apt install gcc git pkg-config meson ninja-build \
         libavcodec-dev libavformat-dev libavutil-dev \
         libsdl2-dev

и это не работает затем, необходимо скопировать его одна строка за один раз и вставить его в терминальное одна строка за один раз. Скопируйте каждую строку в затем конец обратной косой черты (\) и никакой пробел после него.

Кроме того, можно скопировать все три строки в gedit или другой редактор, удалите \и сделайте "остроту" как это:

sudo apt install gcc git pkg-config meson ninja-build libavcodec-dev libavformat-dev libavutil-dev libsdl2-dev

затем можно скопировать остроту от редактора и вставить ее в терминал.

0
ответ дан 11 January 2020 в 09:46

Другие вопросы по тегам:

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