¿En qué modo entra el terminal cuando escribo una comilla simple?

11

Cuando ingreso una comilla simple 'en la terminal, pasa a otro modo y los comandos no se ejecutan. ¿Qué es este modo y cuándo lo usamos?

root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#
manikanta
fuente
30
y por que estas corriendo como root?
Zanna
13
Su terminal está en el mismo modo que antes: su shell está en un modo diferente (esperando la finalización de una cadena con otra ')
ohno

Respuestas:

26

Efectivamente, el shell solicita un comando / expresión completo y , por esa razón, muestra la PS2cadena de solicitud.

De man bash:

INCITACIÓN

Cuando se ejecuta de forma interactiva, bash muestra el indicador primario PS1 cuando está listo para leer un comando, y el indicador secundario PS2 cuando necesita más información para completar un comando.

Y un poco antes de eso:

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

Por lo tanto, como puede suponer al leer la documentación, los shells tienen múltiples mensajes con diferentes propósitos. El PS1indicador es su root@sai:~#cadena, que se muestra normalmente cuando ingresa comandos. >es el PS2aviso También hay otros: PS3para el selectbloque de comandos y PS4para la depuración con el set -xcomando. En este caso estamos más interesados PS2.

Hay muchas formas en que el shell puede mostrar la PS2solicitud (y dónde podría ser necesario completar un comando en una nueva línea). El mismo aviso se utiliza cuando realiza la here-docredirección (donde un comando se considera completo cuando ve la cadena de terminación, en este ejemplo EOF):

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

Muy a menudo, la continuación de un comando largo se puede hacer agregando \una nueva línea inmediata (!), Lo que hará que aparezca el mismo mensaje:

$ echo Hello\
> World
HelloWorld

$ echo 'Hello\                                                                                                           
> World'
Hello\
World

Cuando las tuberías, los operadores lógicos o las palabras clave especiales aparecen en la línea de comando antes de la nueva línea, el comando también se considera incompleto hasta que se ingresen todas las declaraciones finales:

$ 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

En su caso particular, una cita simple implica una interpretación literal de lo que está entre las citas simples. Por lo tanto, como señaló Zanna, está ingresando un comando que consiste en nueva línea + ls+ nueva línea. No se puede encontrar un nombre de archivo ejecutable de este tipo (y, por lo general, los nombres de archivo de comandos deben consistir solo en caracteres alfanuméricos, además de guiones bajos, guiones y puntos). Aunque de hecho es posible tener nombres de archivo que contengan caracteres especiales, siempre se evita.

NOTA : tal comportamiento, como se muestra en su ejemplo, es específico de los shells tipo Bourne, incluidos bash, dash(en Ubuntu está vinculado a /bin/sh) ksh, y mksh. cshy sus derivados no se comportan de esa manera:

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

Sin embargo, en modo interactivo, cshseguirá apareciendo? como prompt2 cuando se requiera más entrada:

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

Ver también:

Sergiy Kolodyazhnyy
fuente
El enlace What's the difference between <<, <<< and < < in bash?está fuera de línea / incorrecto.
Tico
@Tico Gracias arreglado. La respuesta se escribió con una velocidad de Internet de mil tortugas por segundo, lo que resultó en un enlace parcialmente copiado. Reparado ahora
Sergiy Kolodyazhnyy
3
Mientras tanto, zsh tiene la amabilidad de decirle lo que está esperando, lo que a veces es útil si creía que su comando era válido pero olvidó escapar de algo.
Kevin
30

El caparazón solo está esperando la cotización de cierre. Cuando lo ingrese, hará exactamente lo que hace habitualmente e intentará ejecutar el comando ingresado.

Las comillas hacen que el shell no interprete caracteres especiales, lo que significa que no se realizan expansiones. Las comillas simples suprimen completamente toda interpretación de caracteres especiales. Normalmente, una nueva línea separa los comandos, pero aquí ha incluido las nuevas líneas como parte del comando entre comillas.

Como no existe tal comando <newline>ls<newline>, no se encuentra.

Zanna
fuente