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

9

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

root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#
    
por manikanta 08.03.2017 / 08:03

2 respostas

22

Efetivamente, o shell pede comando / expressão completo e, por essa razão, está exibindo PS2 string de prompt.

De man bash :

% bl0ck_qu0te%

E um pouco antes disso:

% bl0ck_qu0te%

Assim, como você pode imaginar lendo a documentação, os shells possuem múltiplos prompts com diferentes propósitos. PS1 prompt é a sua string root@sai:~# , que aparece normalmente quando você digita comandos. > é PS2 prompt. Há outros, também, PS3 para o bloco de comandos select e PS4 para depuração com o comando set -x . Nesse caso, estamos mais interessados em PS2 .

.Existem muitas maneiras em que o shell pode mostrar o prompt PS2 (e onde a conclusão de um comando em uma nova linha pode ser necessária). O mesmo prompt é usado quando você executa here-doc de redirecionamento (em que um comando é considerado completo quando você vê a sequência de terminação, neste exemplo - EOF):

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

Muitas vezes, a continuação do comando longo pode ser feita adicionando \ e imediata (!) nova linha, o 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 comando 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, aspas simples implicam uma interpretação literal entre as aspas simples. Assim, como Zanna apontou, você está digitando um comando que consiste em newline + ls + newline. Esse nome de arquivo executável não pode ser encontrado (e geralmente nomes de arquivo de comando devem consistir apenas em uma única seqüência de caracteres ascii). Embora seja realmente possível ter nomes de arquivos que contenham caracteres especiais, é sempre evitado.

OBSERVAÇÃO : tal comportamento como mostrado no seu exemplo é específico para shells parecidos com o Bourne, incluindo bash , dash (no Ubuntu ele é symlink para /bin/sh ), ksh e mksh . csh e suas derivadas não se comportam dessa maneira:

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

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

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

Veja também:

por Sergiy Kolodyazhnyy 08.03.2017 / 08:40
27

O shell está aguardando a cotação de fechamento. Ao entrar, ele fará exatamente o que normalmente faz e tentará executar o comando inserido.

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

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

    
por Zanna 08.03.2017 / 08:12