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:~#
')
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:~#
')
Respuestas:
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
What's the difference between <<, <<< and < < in bash?está fuera de línea / incorrecto.
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.