¿Qué tan bien sabes bash?


¿Usas la concha todos los días? ¿Listo para resolver algunos problemas lógicos y aprender algo nuevo? Bienvenido a cat.

Algunas de las tareas presentadas aquí no traerán beneficios reales, ya que afectan algunos casos límite complejos. La otra parte será útil para aquellos que usan constantemente el shell y leen los guiones de otras personas.

Nota: al momento de escribir este artículo, el autor usaba bash 4.4.12 (1) -lanzamiento en el subsistema Linux en Windows 10. La complejidad de las tareas es diferente.

Flujos de entrada / salida


Tarea 1

$ cat 1 The cake is a lie! Wanted! Cake or alive $ cat 1 | head | tail | sed -e 's/alive/dead/g' | tee | wc -l > 1 

¿Cuántas líneas habrá en el archivo 1 después del comando?

La respuesta
1

Explicación
Después de interpretar el comando, pero antes de ejecutar todos los programas, bash funciona con los flujos de entrada / salida especificados. Por lo tanto, el archivo 1 se borra antes de iniciar el primer programa y cat abre el archivo ya borrado.

Tarea 2

 $ cat file1 I love UNIX! $ cat file2 I don't like UNIX $ cat file1 <file2 

¿Qué se mostrará en la pantalla?

La respuesta
I love UNIX!

Explicación
Algunos programas martillan en stdin cuando se especifican los archivos.

Tarea 3

 $ cat file Just for fun $ cat file 1>&2 2>/dev/null 

¿Qué se mostrará en la pantalla?

La respuesta
Just for fun

Explicación
Existe la idea errónea de que la secuencia 1>&2 redirige el primer hilo al segundo, sin embargo, esto no es así. Considere el equipo de la tarea. Al comienzo de la interpretación del comando ingresado, la tabla de flujo se ve así:
0 012
stdinstdoutstderr

bash detecta la secuencia 1>&2 y copia el contenido de la celda 2 a la celda 1:
0 012
stdinstderrstderr

Después de detectar la secuencia 2>/dev/null intérprete escribe el valor en la celda 2, dejando las otras celdas intactas:
0 012
stdinstderr/ dev / null

bash también muestra una secuencia de errores, por lo que encontramos el texto del archivo en la pantalla.

Tarea 4
¿Cómo enviar la salida stdout a stderr y la salida stderr, por el contrario, a stdout?

La respuesta
4>&1 1>&2 2>&4

Explicación
El principio es exactamente el mismo que en la tarea anterior. Es por eso que necesitamos una secuencia adicional para el almacenamiento temporal.

Ejecutables


Tarea 5

Dado el archivo test.sh

 #!/bin/bash ls $* ls $@ ls "$*" ls "$@" 

Se ejecutan los siguientes comandos:

 $ ls 1 2 3 test.sh $ ./test.sh 1 2 3 

¿Cuál será el resultado del script?

La respuesta
1 2 3
1 2 3
ls: cannot access '1 2 3': No such file or directory
1 2 3


Explicación
Sin comillas, las variables $ * y $ @ no son diferentes y se expanden en todos los argumentos posicionales del script, separados por un espacio. Entre comillas, el método de divulgación cambia: $ * se convierte en "$ 1 $ 2 $ 3" ​​y $ @ a su vez en "$ 1" "$ 2" "$ 3". Como el archivo "1 2 3" no está en el directorio, ls muestra un error

Tarea 6

En el directorio actual, cree un archivo -c con permisos de 755 y los siguientes contenidos:

 #!/bin/bash echo $1 

Ponga a cero la variable $ PATH e intente ejecutar:

 $ PATH= $ -c "echo SURPRISE" 

¿Qué se mostrará en la pantalla? ¿Qué sucede si vuelve a ingresar el último comando?

La respuesta
La primera vez se mostrará SURPRISE , la segunda vez echo SURPRISE

Explicación
Si PATH está vacío, el shell comienza a buscar archivos en el directorio actual. -c está ubicado Como el archivo ejecutable es un archivo de texto, la primera línea se lee sobre el tema de shebang. El equipo se ensambla de acuerdo con la plantilla:

 <shebang> <filename> <args> 

Por lo tanto, antes de la ejecución, nuestro comando se ve así:

 /bin/bash -c "echo SURPRISE" 

Y, como resultado, no es completamente lo que queríamos hacer.

Si lo ejecuta por segunda vez, el shell recogerá información sobre -c del caché y la ejecutará correctamente. La única forma de protegerse de un efecto tan inesperado es agregar dos desventajas al shebang.

Variables


Tarea 7

 $ ls file $ cat <$(ls) $ cat <(ls) 

¿Qué se mostrará en el primer y segundo caso?

La respuesta
El primero mostrará el contenido del archivo, el segundo, el nombre del archivo.

Explicación
En el primer caso, la sustitución se realiza

 cat <file 

En el segundo caso, <(ls) será reemplazado por una tubería con nombre conectada por la entrada a stdout ls y la salida de stdin cat.

Después de la sustitución, el comando tomará la forma:

 cat /dev/fd/xx 


Tarea 8

 $ TEST=123456 $ echo ${TEST%56} 

¿Qué se mostrará en la pantalla?

La respuesta
1234

Explicación
Con tal registro, el patrón coincide (# - desde el principio de la variable; ## - codiciosamente desde el comienzo de la variable;% - desde el final de la variable; %% - codiciosamente desde el final de la variable) y se elimina al sustituir. El contenido de la variable permanece intacto. Así, por ejemplo, es conveniente obtener el nombre del archivo sin la extensión.

 $ TEST=file.ext $ echo ${TEST%.ext} file 


Tarea 9

 $ echo ${friendship:-magic} 

¿Qué se mostrará en la pantalla?

La respuesta
Si se define la variable de amistad, entonces el contenido de la variable. De lo contrario, magia.

Explicación
En la documentación, esta magia se llama "no establecida o nula" y le permite usar el valor predeterminado especificado de una variable en una línea.

Orden de ejecución


Tarea 10

 while true; false; do echo Success done 

¿Qué se mostrará en la pantalla?

La respuesta
Nada

Explicación
Las instrucciones while y if le permiten incluir una secuencia completa de acciones en la condición, pero el resultado (código de retorno) se tendrá en cuenta solo en el último comando. Como es falso, el ciclo ni siquiera comenzará.

Tarea 11

 $ false && true || true && false && echo 1 || echo 2 

¿Qué se mostrará en la pantalla?

La respuesta
2

Explicación
Agregue paréntesis para un orden explícito y simplifique el comando, teniendo en cuenta que solo se tiene en cuenta el código de retorno del último comando:

 ((((false && true) || true) && false) && echo 1) || echo 2 (((false || true) && false) && echo 1) || echo 2 ((true && false) && echo 1) || echo 2 (false && echo 1) || echo 2 false || echo 2 echo 2 


Comentarios, sugerencias y tareas adicionales son bienvenidos en comentarios o PM.

Source: https://habr.com/ru/post/es413935/


All Articles