Em que modo o terminal entra quando digito uma aspas simples?

11

Quando insiro aspas simples 'no terminal, ele passa para outro modo, e os comandos não são executados. O que é esse modo e quando o usamos?

root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#
manikanta
fonte
30
e por que você está executando como root?
Zanna
13
Seu terminal é no mesmo modo como antes - o seu shell está em um modo diferente (aguardando a conclusão de uma corda com outro ')
Ohno

Respostas:

26

Efetivamente, o shell solicita um comando / expressão completo e, por esse motivo, está exibindo a PS2sequência de prompt.

De man bash:

PROMPTING

Ao executar interativamente, o bash exibe o prompt primário PS1 quando estiver pronto para ler um comando e o prompt secundário PS2 quando precisar de mais entradas para concluir um comando.

E um pouco antes disso:

  PS2    The value of this parameter is  expanded
          as  with  PS1  and used as the secondary
          prompt string.  The default is ``> ''.

Portanto, como você pode imaginar ao ler a documentação, os shells têm vários prompts com diferentes propósitos. O PS1prompt é sua root@sai:~#string, que aparece normalmente quando você insere comandos. >é o PS2prompt. Existem outros também: PS3para selectbloco de comando e PS4para depuração com set -xcomando. Nesse caso, estamos mais interessados PS2.

Há muitas maneiras pelas quais o shell pode mostrar o PS2prompt (e onde pode ser necessário concluir um comando em uma nova linha). O mesmo prompt é usado quando você executa o here-docredirecionamento (em que um comando é considerado completo quando você vê a sequência final, neste exemplo EOF):

$ cat <<EOF
> line one
> line two
> EOF
line one
line two

Muitas vezes, a continuação de um comando demorado pode ser feita adicionando \uma nova linha (!) Imediata, que fará com que o mesmo prompt apareça:

$ echo Hello\
> World
HelloWorld

$ echo 'Hello\                                                                                                           
> World'
Hello\
World

Quando canais, operadores lógicos ou palavras-chave especiais aparecem na linha de comandos antes da nova linha, o comando também é considerado incompleto até que todas as instruções finais sejam inseridas:

$ echo Hello World | 
> wc -l
1

$ echo Hello World &&                                                                                                    
> echo "!"
Hello World
!

$ for i in $(seq 1 3); do
> echo "$i"
> done
1
2
3 

$ if [ -f /etc/passwd ]
> then
>     echo "YES"
> fi
YES

No seu caso particular, uma aspas simples implica uma interpretação literal do que está entre as aspas simples. Assim, como Zanna apontou, você está inserindo um comando que consiste em nova linha + ls+ nova linha. Esse nome de arquivo executável não pode ser encontrado (e geralmente os nomes dos arquivos de comando devem consistir apenas em caracteres alfanuméricos, além de sublinhados, traços e pontos). Embora seja realmente possível ter nomes de arquivos que contenham caracteres especiais, sempre é evitado.

NOTA : tal comportamento como mostrado no seu exemplo é específico para Bourne-como conchas, incluindo bash, dash(no Ubuntu que é ligada simbolicamente a /bin/sh), kshe mksh. cshe seus derivados não se comportam dessa maneira:

$ tcsh                                                    
eagle:~> '
Unmatched '.
eagle:~> csh
% '
Unmatched '.
%  

No entanto, no modo interativo, cshainda aumentará ?como prompt2 quando mais entradas forem necessárias:

$ csh
% foreach n ( 1 2 3 )
? echo $n
? end
1
2
3  

Veja também:

Sergiy Kolodyazhnyy
fonte
O link What's the difference between <<, <<< and < < in bash?está offline / errado.
Tico
@Tico Obrigado corrigido. A resposta foi escrita com a velocidade da Internet de mili-tartarugas por segundo, o que resultou apenas no link parcialmente copiado. Corrigido agora
Sergiy Kolodyazhnyy 8/0317
3
Enquanto isso, o zsh é gentil o suficiente para realmente dizer o que está esperando, o que é ocasionalmente útil se você pensou que seu comando era válido, mas esqueceu de escapar de algo.
Kevin
30

O shell está apenas aguardando a cotação de fechamento. Quando você o digita, ele faz exatamente o que costuma fazer e tenta executar o comando digitado.

As aspas fazem com que o shell não interprete caracteres especiais, o que significa que expansões não são executadas. Aspas simples suprimem completamente toda a interpretação de caracteres especiais. Normalmente, uma nova linha separa comandos, mas aqui você incluiu as novas linhas como parte do comando, citando-as.

Como não existe um comando como <newline>ls<newline>, ele não foi encontrado.

Zanna
fonte