103.1 Lección 2
Certificación: |
LPIC-1 |
---|---|
Versión: |
5.0 |
Tema: |
103 Comandos GNU y Unix |
Objectivo: |
103.1 Trabajando en la línea de comandos |
Lección: |
2 de 2 |
Introducción
Un entorno de sistema operativo incluye las herramientas básicas, como shells de línea de comandos y, a veces, una GUI, que necesitará para hacer las cosas. Pero su entorno también vendrá con un catálogo de accesos directos y valores preestablecidos. Aquí es donde aprenderemos cómo listar, invocar y administrar esos valores.
Encontrar las variables de entorno
Entonces, ¿cómo identificamos los valores actuales para cada una de nuestras variables de entorno? Una forma es a través del comando env
:
$ env DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus XDG_RUNTIME_DIR=/run/user/1000 XAUTHORITY=/run/user/1000/gdm/Xauthority XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin GJS_DEBUG_TOPICS=JS ERROR;JS LOG [...]
Obtendrá una gran cantidad de resultados, mucho más de lo que se incluye en el extracto anterior. Pero por ahora tenga en cuenta la entrada PATH
, que contiene los directorios donde su shell (y otros programas) buscarán otros programas sin tener que especificar una ruta completa. Con ese conjunto, podría ejecutar un programa binario que reside, por ejemplo, en /usr/local/bin
desde su directorio de inicio y se ejecutaría como si el archivo fuera local.
Cambiemos de tema por un momento. El comando echo
imprimirá en la pantalla lo que usted le indique. Lo crea o no, habrá muchas veces que será muy útil que echo
repita literalmente algo.
$ echo "Hi. How are you?" Hi. How are you?
Pero hay algo más que puede hacer con echo
. Cuando le da el nombre de una variable de entorno, y le dice que esta es una variable al prefijar el nombre de la variable con un $
, entonces, en lugar de simplemente imprimir el nombre de la variable, el shell lo expandirá dándole el valor. ¿No está seguro de si su directorio favorito está actualmente en la ruta? Puede verificar rápidamente ejecutándolo a través de echo
:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Crear nuevas variables de entorno
Puede agregar sus propias variables personalizadas a su entorno. La forma más simple es usar el caracter =
. La cadena a la izquierda será el nombre de su nueva variable, y la cadena a la derecha será su valor. Ahora puede verificar el nombre de la variable con echo
para confirmar que funcionó:
$ myvar=hello $ echo $myvar hello
Note
|
Observe que no hay espacio a ambos lados del signo igual durante la asignación de variables. |
¿Pero realmente funcionó? Escriba bash
en la terminal para abrir un nuevo shell. Este nuevo shell se ve exactamente como el que acababa de encontrar, pero en realidad es un hijo (child) del original (al que llamamos parent). Ahora, dentro de esta nueva consola hija, intente obtener el valor con echo
. Nada. ¿Qué está pasando?
$ bash $ echo $myvar $
Una variable creada de la manera que acabamos de hacerlo solo estará disponible localmente, dentro de la sesión de shell inmediata. Si inicia un nuevo shell, o cierra la sesión con exit
, la variable no lo acompañará. Si escribe exit
aquí, volverá a su shell principal original que, en este momento, es donde queremos estar. Puede ejecutar echo $myvar
una vez más si lo desea solo para confirmar que la variable sigue siendo válida. Ahora escriba export myvar
para pasar la variable a los shells secundarios que pueda abrir posteriormente. Pruébelo: teclee bash
para un nuevo shell y luego echo
:
$ exit $ export myvar $ bash $ echo $myvar hello
Todo esto puede parecer un poco útil cuando estamos creando shells sin ningún propósito real. Pero comprender cómo se propagan las variables de shell a través de su sistema será muy importante una vez que comience a escribir scripts.
Eliminar variables de entorno
¿Quiere saber cómo limpiar todas esas variables que ha creado? Una forma es simplemente cerrar su shell principal o reiniciar su computadora. Pero hay formas más simples. Como, por ejemplo, unset
. Al escribir unset
(sin el $
) se eliminará la variable. Con echo
podemos verificarlo.
$ unset myvar $ echo $myvar $
Si existe un comando unset
, entonces existe un comando set
. Ejecutar set
por sí solo mostrará una gran cantidad de resultados, pero en realidad no es tan diferente de lo que env
muestra. Mire la primera línea de salida que obtendrá cuando filtre por PATH
:
$ set | grep PATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin [...]
¿Cuál es la diferencia entre set
y env
? Para nuestros propósitos, lo principal es que set
generará todas las variables y funciones. Vamos a ilustrar eso. Crearemos una nueva variable llamada mynewvar
y luego confirmaremos que está allí:
$ mynewvar=goodbye $ echo $mynewvar goodbye
Ahora, ejecutar env
mientras se usa grep
para filtrar la cadena mynewvar
no mostrará ningún resultado. Pero ejecutar set
de la misma manera nos mostrará nuestra variable local.
$ env | grep mynewvar $ set | grep mynewvar mynewvar=goodbye
Mantener el Valor de Caracteres Especiales
Ahora es un buen momento para presentar el problema de los caracteres especiales. Bash normalmente leerá literalmente los caracteres alfanuméricos (a-z y 0-9). Si intenta crear un nuevo archivo llamado myfile
, simplemente escriba touch
seguido de myfile
y Bash sabrá qué hacer con él. Pero si desea incluir un carácter especial en su nombre de archivo, deberá hacerlo de una forma diferente.
Para ilustrar esto, escribiremos touch
y lo definimos el nombre: my big file
. El problema es que hay dos espacios entre las palabras que Bash interpretará. Si bien, técnicamente, no llamarías a un espacio un “caracter”, uno esperaría que Bash lo entendiera de esa forma. Si lista el contenido de su directorio actual, en lugar de un archivo llamado my big file
, verá tres archivos denominados, respectivamente, my
, big
y file
. Esto se debe a que Bash interpretó que deseaba crear varios archivos cuyos nombres estaba pasando en una lista:
$ touch my big file $ ls my big file
Los espacios se interpretarán de la misma manera si elimina (rm
) los tres archivos, todo en un comando:
$ rm my big file
Ahora probémoslo de la manera correcta. Escriba touch
y las tres partes de su nombre de archivo, pero esta vez incluya el nombre entre comillas dobles. Esta vez funcionó. Listar el contenido del directorio le mostrará un solo archivo con el nombre apropiado.
$ touch "my big file" $ ls 'my big file'
Hay otras formas de obtener el mismo efecto. Las comillas simples, por ejemplo, funcionan tan bien como las comillas dobles. (Tenga en cuenta que las comillas simples conservarán el valor literal de todos los caracteres, mientras que las comillas dobles conservarán todos los caracteres excepto para $
, `
, \
y, en ciertos casos, !
.)
$ rm 'my big file'
Anteponer cada carácter especial con la barra invertida “escape” hará que Bash lo lea literalmente.
$ touch my\ big\ file
Ejercicios Guiados
-
Use el comando
export
para agregar un nuevo directorio a su ruta (este no debe sobrevivir a un reinicio). -
Use el comando
unset
para eliminar la variablePATH
. Intente ejecutar un comando (comosudo cat /etc/shadow
) usandosudo
. ¿Que pasó? ¿Por qué? (Al salir de su shell, volverá a su estado original).
Ejercicios Exploratorios
-
Busque en Internet para encontrar y explorar la lista completa de caracteres especiales.
-
Intente ejecutar comandos usando cadenas formadas por caracteres especiales y usando varios métodos para escaparlos. ¿Hay diferencias entre la forma en que se comportan esos métodos?
Resumen
En esta lección aprendimos:
-
¿Cómo identificar las variables de entorno de su sistema?
-
¿Cómo crear sus propias variables de entorno y exportarlas a otros shells?
-
¿Cómo eliminar variables de entorno y cómo usar los comandos
env
yset
? -
¿Cómo escapar caracteres especiales para que Bash los lea literalmente?
Los siguientes comandos se discutieron en esta lección:
echo
-
Imprime cadenas de entrada y variables.
env
-
Entiende y modifica sus variables de entorno.
export
-
Pasa una variable de entorno a los shells secundarios.
unset
-
Borra valores y atributos de variables y funciones de shell.
Respuestas a los ejercicios guiados
-
Use el comando
export
para agregar un nuevo directorio a su ruta (esto no debe sobrevivir a un reinicio).Puede agregar temporalmente un nuevo directorio (quizás uno llamado
myfiles
que se encuentra en su directorio de inicio) a su ruta usandoexport PATH="/home/yourname/myfiles:$PATH"
. Cree un script simple en el directoriomyfiles/
, hágalo ejecutable e intente ejecutarlo desde un directorio diferente. Estos comandos suponen que está en su directorio de inicio que contiene un directorio llamadomyfiles
.$ touch myfiles/myscript.sh $ echo '#!/bin/bash' >> myfiles/myscript.sh $ echo 'echo Hello' >> myfiles/myscript.sh $ chmod +x myfiles/myscript.sh $ myscript.sh Hello
-
Use el comando
unset
para eliminar la variablePATH
. Intente ejecutar un comando (comosudo cat /etc/shadow
) usandosudo
. ¿Que pasó? ¿Por qué? (Al salir de su shell, volverá a su estado original).Al escribir
unset PATH
se borrará la configuración de ruta actual. Intentar invocar un binario sin su dirección absoluta fallará. Por esa razón, intentar ejecutar un comando usando sudo (que en sí mismo es un programa binario ubicado en/usr/bin/sudo
) fallará, a menos que especifique la ruta absoluta, como en:/usr/bin/sudo/bin/cat/etc/shadow
. Puede restablecer suPATH
usandoexport
o simplemente salga del shell.
Respuestas a ejercicios exploratorios
-
Busque en Internet para encontrar y explorar la lista completa de caracteres especiales.
Lista de ejemplo:
& ; | * ? " ' [ ] ( ) $ < > { } # / \ ! ~
. -
Intente ejecutar comandos usando cadenas formadas por caracteres especiales y usando varios métodos para escaparlos. ¿Hay diferencias entre la forma en que se comportan esos métodos?
Escapar usando caracteres
"
conservará los valores especiales del signo de dólar, una barra invertida y la barra invertida. Escapar usando un carácter'
hará que todos los caracteres sean literales.$ echo "$mynewvar" goodbye $ echo '$mynewvar' $mynewvar