O terminal mostra> depois de entrar em \

Respostas:

35

Sempre que você usa a linha de comando, pode haver uma instância em que você precisa executar um comando que é muito longo. Portanto, você deseja dividir o comando em várias linhas para melhor legibilidade e entendimento. Mas se você usar um novo caractere de linha digitado Enter, o shell pensará que é um novo comando. Então você usa \seguido pelo caractere de nova linha.

Basicamente, os comandos ou scripts bash são "interpretados", isto é, executados linha por linha. Cada nova linha significa o início de um novo comando. No terminal, quando você pressiona Enter, você recebe um prompt para executar um novo comando. Portanto, uma nova linha precisa ser "escapada". Digitar \seguido de Enterpermite dividir o comando atual em várias linhas, para que o shell não pense que é um novo comando, mas a continuação do comando anterior.

> nada mais é do que um prompt para a próxima linha do comando que está sendo inserida.

Por exemplo:
Se queremos instalar vários pacotes, o comando será como

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

Mas, às vezes, isso torna o comando confuso. Para que possamos usar \seguido por Enter(caractere de nova linha)

$ sudo apt install [package1]\
> [package2]\
> [package3]\
> ...
Kulfy
fonte
4
@Curiouskangaroo BTW, você pode controlar como os novos prompts de comando e continuação de linha funcionam, definindo valores para as variáveis $PS1e $PS2. Consulte a página do manual do bash para aprender o formato e use echo "'$PS2'"para visualizar a configuração atual.
jpaugh 8/01
14

O caractere de barra invertida ( \) é usado como caractere de escape no shell. Se você o usar como o último caractere da linha, ele escapará da nova linha, para que você possa continuar seu comando na próxima linha, em vez de finalizá-la. Isso é indicado pelo >prompt no Bash.

Exemplo:

$ echo A\
> B
AB
$

Para colocar um literal \em seu comando, você deve escapá-lo usando outra barra invertida:

$ echo \\
\
$
Melebius
fonte
7

[adicionando uma resposta (muito longa / complexa), pois os outros 2 não mencionam como o ">" aparece ... ou seja, não mencionam o PS2]

Você digitou:: \Enterthe \diz para o shell apenas exibir o Entercaractere literário em vez de interpretá-lo como de costume (Portanto, o shell "vai para a próxima linha" em vez de terminar a linha de comando atual e interpretá-la. A menos que você esteja em algum outras construções, como heredoc, loop for, etc).

Seu terminal, portanto, interpreta \Entercomo: "vá para a próxima linha" (sem começar a interpretar o comando) e, portanto, o terminal agora permite que você insira a segunda linha de um comando de várias linhas e, para torná-lo mais visível, exibe o $PS2conteúdo ( chamado prompt do PS2 ) em cada linha subseqüente.

A variável PS2 geralmente é definida por padrão como: PS2="> "e você pode, por exemplo, editar seu ~ / .bashrc para redefini-lo como desejar (levando em consideração que ele deve, imo, evitar conter caracteres perigosos, como >ou ;, e deve ajudá-lo quer ver claramente que é uma comandos de várias linhas, mas desativar seu conteúdo de várias linhas (ex: PS2="#cont#") ou deixá-lo facilmente copiar / colar-los com tão pouco impacto em suas linhas quanto possível (ex: PS2=" ")

O que, a propósito, é um padrão ruim, pois pode muito bem levar alguém a excluir alguns comandos binários importantes em alguns casos.

Você pode redefinir o PS2 para ser outra coisa (eu gosto: PS2 = "", por exemplo) para que os comandos de múltiplas linhas possam ser facilmente copiados / colados sem temer o seguinte:

Por exemplo, digamos que você tenha um comando que começa a ser bastante longo (e pode dobrar na tela se o terminal não for largo o suficiente):

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

Se o comando parecer muito longo (e contornar), convém dividi-lo visualmente em duas linhas, escolhendo onde (quando) você deseja a próxima linha inserindo: \Enterno local apropriado:

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

Usando o PS2 padrão, o shell adicionou ">" before "/ etc / someimportantfile". Portanto, se você copiar / colar essas 2 linhas em outro terminal, sua ação será completamente diferente: em vez de grepping em 4 arquivos, o grep é entrando apenas nos 3 primeiros arquivos, e a saída grep substitui o conteúdo do 4º arquivo (/ etc / someimportantfile)!

Para evitar esses problemas (e muitos outros): por exemplo, você pode definir: PS2=" "para tornar os comandos de várias linhas mais limpos e fáceis de copiar / colar:

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

Observe como esse comando time / bin / som é simplesmente deslocar 2 espaços para a direita e nenhum ">" foi inserido, para que você possa copiar / colar com segurança este comando de 2 linhas.

O PS2 também é usado nos loops "for" "while" etc, e tê-lo definido como "" é, para mim, melhor naqueles também.

Olivier Dulac
fonte