JS, Node.js, Frontend, Backend, Firebase, Express, Patrones, HTML5_APIs, Asincronía, Websockets, Testing
Una Shell de Unix o también shell, es el término usado en informática para referirse a un intérprete de comandos, el cual consiste en la interfaz de usuario tradicional de los sistemas operativos basados en Unix y similares como GNU/Linux.
Mediante las instrucciones que aporta el intérprete, el usuario puede comunicarse con el núcleo y por extensión, ejecutar dichas órdenes, así como herramientas que le permiten controlar el funcionamiento de la computadora.
Los comandos que aportan los intérpretes, pueden usarse a modo de guion si se escriben en ficheros ejecutables denominados shell-scripts, de este modo, cuando el usuario necesita hacer uso de varios comandos o combinados de comandos con herramientas, escribe en un fichero de texto marcado como ejecutable, las operaciones que posteriormente, línea por línea, el intérprete traducirá al núcleo para que las realice. Sin ser un shell estrictamente un lenguaje de programación, al proceso de crear scripts de shell se le denomina programación shell o en inglés, shell programming o shell scripting. Wikipedia
Terminales más comunes
- bash - GNU Project's shell (Bourne Again SHell)
- elvish - Friendly, expressive shell features like anonymous functions and data structures
- fish - Smart and user-friendly command line shell
- shenv - Simple shell version management
- xiki - Makes the shell console more friendly and powerful
- xonsh - Python-ish, BASHwards-looking shell language and command prompt
- zsh - Powerful shell with scripting language
Terminales Awesomicas
Recursos
- Bash Hackers Wiki
- Greg Wooledge's (aka "greycat") wiki. Specifically Bash Guide, Bash FAQ and Bash Pitfalls
- Google's Shell Style Guide
- The Linux Documentation Project: Bash Programming - Intro/How-to
- The Linux Documentation Project: Advanced Bash Scripting Guide
- WikiBooks: Bash Shell Scripting
- Use the Unofficial Bash Strict Mode (Unless You Looove Debugging)
- The Art of Command Line
- Learn Enough Command Line to Be Dangerous
- A guide to learn bash
- Bash-Snippets – A Collection Of Useful BASH Scripts For Heavy Commandline Users
- 400 comandos que deberias conocer
- Terminal online
- Webminal
- C9 - Terminal - Documentación
- denysdovhan/bash-handbook
- Idnan/bash-guide
- Wiki de bash-hackers
# En una sola línea...
: '
Comentario
en multiples
líneas...
'
#!/usr/bin/env bash
nombre="Yo mismo"
echo "Hola $nombre!"
nombre="Yo mismo"
echo $nombre
echo "$nombre"
echo "${nombre}!"
- usando
'$nombre'
es literal. - usando
"$nombre"
nombre="Yo mismo"
echo "Hola $nombre" #=> Hola Yo mismo
echo 'Hola $nombre' #=> Hola $nombre
echo "Primero estos..." && "Si todo va bien... saldrá esto después"
git commit || echo "Esto pasa cuando falla lo anterior"
quien_eres() {
echo "Yo mismo"
}
echo "Tu eres... $(quien_eres)"
echo "Estoy en $(pwd)"
echo "Estoy en `pwd`"
# Same
echo {A,B}.js # A.js B.js
echo {1..5} # 1 2 3 4 5
Lo básico
nombre="Fictizia"
echo ${nombre}
echo ${nombre/i/1} #=> F1ctizia
echo ${nombre:0:5} #=> Ficti
echo ${nombre::2} #=> Fi
length=2
echo ${nombre:0:length} #=> Fi
STR="/ruta/carpeta/fichero.sh"
echo ${STR%.sh} # /ruta/carpeta/fichero
echo ${STR%.sh}.hacked # /ruta/carpeta/fichero.hacked
echo ${STR##*.} # sh (extension)
echo ${STR##*/} # fichero.sh (script con extension)
echo ${STR#*/} # ruta/carpeta/fichero.sh
echo ${STR##*/} # fichero.sh
echo ${STR/carpeta/folder} # /ruta/folder/fichero.sh
Valores por defecto
${DATO:-val} # $DATO, o val si no existe
${DATO:=val} # Iguala $DATO a val si no existe
${DATO:+val} # val si $DATO existe
${DATO:?message} # Muestra mensaje de error y sale si $DATO NO EXISTE
# Muestra "mensaje" como opcional)
Ejemplo:
unset EGGS
echo 1 ${EGGS-spam} # 1 spam
echo 2 ${EGGS:-spam} # 2 spam
EGGS=
echo 3 ${EGGS-spam} # 3
echo 4 ${EGGS:-spam} # 4 spam
EGGS=cheese
echo 5 ${EGGS-spam} # 5 cheese
echo 6 ${EGGS:-spam} # 6 cheese
For (básico)
for i in /etc/rc.*; do
echo $i
done
Rangos
# Continuo
for i in {1..5}; do
echo "Welcome $i"
done
Rangos con pasos
for i in {5..50..5}; do
echo "Welcome $i"
done
While
while true; do
#···
done
Por cada linea de un fichero
cat file.txt | while read line; do
echo $line
done
Definición de funciones
miFuncion() {
echo "Hola $1"
}
# Otra forma
function miFuncion() {
echo "Hola $1"
}
miFuncion "Amigo!" #Hola Amigo!
Retorno de valores
miFuncion() {
local resul='Dato...'
echo $resul
}
resultado=$(miFuncion)
echo ${resultado} #Dato...
Lanzamiento de Errores
miFuncion() {
echo 1
}
if miFuncion; then
echo "Éxito"
else
echo "Fallo"
fi
Argumentos
$# # Numero de Argumentos
$* # Todos los argumentos
$@ # Todos los argumentos, Empezando por el primero
$1 # Primer Argumento
Operadores
[ -z STRING ] # Cadena vacia
[ -n STRING ] # Cadena NO vacia
[ NUM -eq NUM ] # igual
[ NUM -ne NUM ] # desigual
[ NUM -lt NUM ] # Menor que
[ NUM -le NUM ] # Menor o igual que
[ NUM -gt NUM ] # Mayor que
[ NUM -ge NUM ] # Mayor o igual que
[[ STRING =~ STRING ]] # Expresión regular
[ ! EXPR ] # Not
[ X ] && [ Y ] # And
[ X ] || [ Y ] # Or
Operadores de ficheros
[ -e ARCHIVO ] # Existe
[ -r ARCHIVO ] # Leible
[ -h ARCHIVO ] # Symlink (Vinculos simbolicos)
[ -d ARCHIVO ] # Directorio
[ -w ARCHIVO ] # Escribible
[ -s ARCHIVO ] # La logitud es mayor de 0 bytes
[ -f ARCHIVO ] # Fichro
[ -x ARCHIVO ] # Ejecutable
[ ARCHIVO1 -nt ARCHIVO2 ] # ARCHIVO1 es más reciente que ARCHIVO2
[ ARCHIVO1 -ot ARCHIVO2 ] # ARCHIVO2 es más reciente que ARCHIVO1
[ ARCHIVO1 -ef ARCHIVO2 ] # Son lo mismo ARCHIVO1 y ARCHIVO2
Ejemplo cadenas de texto
nombre="Yo mismo!"
if [ -z "$nombre" ]; then
echo '$nombre esta vacio'
elif [ -n "$nombre" ]; then
echo '$nombre NO esta vacio'
fi
Ejemplo números
numero=12
if [ ${numero} -ge 0 ]; then
echo Número positivo
else
echo Número negativo
fi
Ejemplo Combinatorios
Name=Steve
Age=15
if [ "$Name" == "Steve" ] && [ "$Age" -eq 15 ]; then echo "This will run if $Name is Steve AND $Age is 15."; fi
This will run if Steve is Steve AND 15 is 15.
Ejemplo Ficheros
if [ -e "fichero.txt" ]; then
echo "fichero.txt existe"
fi
frutas=('Manzana' 'Platano' 'Mnadarina');
lista_nueva[0]="Cohete"
lista_nueva[1]="Astronauta"
lista_nueva[2]="Lanzadera"
frutas=('Manzana' 'Platano' 'Mandarina');
echo Elemento[0]: ${frutas[0]} # Elemento[0]: Manzana
echo Frutas: ${frutas[@]} # Frutas: Manzana Platano Mandarina
echo Longitud: ${#frutas[@]} # Longitud: 3
echo Nº letras de Manzana: ${#frutas} # Nº letras de Manzana: 7
echo Nº letras de Mandarina: ${#frutas[2]} # Nº letras de Mandarina: 0
frutas=('Manzana' 'Platano' 'Mandarina');
for i in "${frutas[@]}"; do
echo Elemento: $i
done
Operaciones
Fruits=('Manzana' 'Platano' 'Mandarina');
Fruits=("${Fruits[@]}" "Sandía") # Push
Fruits=( ${Fruits[@]/Man*/} ) # Eliminar un elemento usando REGEX
unset Fruits[1] # Eliminar un elemento en concreto
lines=(`cat "fichero.txt"`) # Read from file
echo ${Fruits[0]} # Element #0
echo ${Fruits[@]} # All elements, space-separated
echo ${#Fruits[@]} # Number of elements
echo ${#Fruits} # String length of the 1st element
echo ${#Fruits[3]} # String length of the Nth element
echo ${Fruits[@]:0:2} # Range (from position 0, length 2)
$((a + 200)) # Añade 200 a $a
$((RANDOM%=200)) # Número al azar entre 0..200
command -V cd
#=> cd is a shell builtin
echo -n "Proceed? [y/n]: "
read respuesta
echo $respuesta
(cd somedir; echo "I'm now in $PWD")
# pwd # still in first directory
python hello.py > output.txt # stdout to (file)
python hello.py >> output.txt # stdout to (file), append
python hello.py 2> error.log # stderr to (file)
python hello.py 2>&1 # stderr to stdout
python hello.py 2>/dev/null # stderr to (null)
python hello.py &>/dev/null # stdout and stderr to (null)
python hello.py < foo.txt
Las Claves
- Nos permite grabar tareas ciclicas (ejecutar scripts) en la maquina
- El tiempo minimo es de un minuto, una repetición al minuto
- Es altamente configurable
Cron
es un demonio dle sistema que supervisa losjobs
jobs
son las tareas que hemos programado en el sistemaCrontab
es un fichero de texto plano que guarda la información de losjobs
- Necesitas generar un script con
shebang
y permisos de ejecucción
Esquema de tiempo
Agregar tareas
00 19 * * * user_x /carpeta/del/script/ficherito.sh
00 00 1 * * root /carpeta/del/script/algo.js
Recursos
- How to remove or delete single cron job using linux command?
- Linux crontab command
- Cómo utilizar Cron y Crontab en Linux para programar tareas
- Cron & crontab, explicados
- How To Add Jobs To cron Under Linux or UNIX
1 - Katas de Shell en CMD Challenge. ¯\_(ツ)_/¯