Bash (Español)/Functions (Español)
Bash también admite funciones. Añada las funciones a ~/.bashrc
, o a un archivo separado que sea cargado desde ~/.bashrc
. Se pueden encontrar más ejemplos de la función Bash en BBS#30155.
Mostrar códigos de error
Para configurar trap
para interceptar un código de retorno distinto de cero de la última ejecución del programa:
EC() { echo -e '\e[1;33m'code $?'\e[m\n' } trap EC ERR
Compilar y ejecutar una código fuente en C sobre la marcha
La siguiente función compilará (dentro del directorio /tmp/
) y ejecutará el código fuente en C del argumento sobre la marcha (y la ejecución será sin argumentos). Y finalmente, después de que el programa termine, eliminará el archivo compilado.
# Compilar y ejecutar un código fuente en C sobre la marcha csource() { [[ $1 ]] || { echo "Falta el operando" >&2; return 1; } [[ -r $1 ]] || { printf "El archivo %s no existe o no se puede leer\n" "$1" >&2; return 1; } local output_path=${TMPDIR:-/tmp}/${1##*/}; gcc "$1" -o "$output_path" && "$output_path"; rm "$output_path"; return 0; }
Extraer
La siguiente función extraerá una amplia gama de tipos de archivos comprimidos. Utilícelo con la sintaxis extract <archivo1> <archivo2> ...
.
extract() { local c e i (($#)) || return for i; do c='' e=1 if [[ ! -r $i ]]; then echo "$0: el archivo es ilegible: \`$i'" >&2 continue fi case $i in *.t@(gz|lz|xz|b@(2|z?(2))|a@(z|r?(.@(Z|bz?(2)|gz|lzma|xz))))) c=(bsdtar xvf);; *.7z) c=(7z x);; *.Z) c=(uncompress);; *.bz2) c=(bunzip2);; *.exe) c=(cabextract);; *.gz) c=(gunzip);; *.rar) c=(unrar x);; *.xz) c=(unxz);; *.zip) c=(unzip);; *.zst) c=(unzstd);; *) echo "$0: extensión de archivo no reconocida: \`$i'" >&2 continue;; esac command "${c[@]}" "$i" ((e = e || $?)) done return "$e" }
extglob
esté activado: shopt -s extglob
, añadiéndolo a ~/.bashrc
(véase Opciones que cambian el comportamiento de englobado).Otra forma de hacer esto es instalar un paquete especializado, véase Herramientas convenientes de archivado y compresión.
cd y ls en uno
Muy a menudo, al cambiar a un directorio le sigue la orden ls
para listar su contenido. Por lo tanto, es útil tener una segunda función que haga ambas cosas a la vez.
En este ejemplo lo llamaremos cl
(change list, o listar al cambiar) y mostraremos un mensaje de error si el directorio especificado no existe.
cl() { local dir="$1" local dir="${dir:=$HOME}" if -d "$dir" ; then cd "$dir" >/dev/null; ls else echo "bash: cl: $dir: Directorio no encontrado" fi }
Por supuesto, la orden ls puede modificarse para adaptarse a sus necesidades, por ejemplo, ls -hall --color=auto
.
Tomador de notas simple
note () { # si el archivo no existe, créalo if ! -f $HOME/.notes ; then touch "$HOME/.notes" fi if ! (($#)); then # sin argumentos, imprimir archivo cat "$HOME/.notes" elif "$1" == "-c" ; then # limpiar archivo printf "%s" > "$HOME/.notes" else # añadir todos los argumentos al archivo printf "%s\n" "$*" >> "$HOME/.notes" fi }
Utilidad de tarea simple
Inspirado en #Tomador de notas simple.
todo() { if ! -f $HOME/.todo ; then touch "$HOME/.todo" fi if ! (($#)); then cat "$HOME/.todo" elif "$1" == "-l" ; then nl -b a "$HOME/.todo" elif "$1" == "-c" ; then > $HOME/.todo elif "$1" == "-r" ; then nl -b a "$HOME/.todo" eval printf %.0s- '{1..'"${COLUMNS:-$(tput cols)}"\}; echo read -p "Introduzca un número para eliminar: " number sed -i ${number}d $HOME/.todo "$HOME/.todo" else printf "%s\n" "$*" >> "$HOME/.todo" fi }
Calculadora
calc() { echo "scale=3;$@" | bc -l }
Kingbash
Kingbash - autocompletado dirigido por menú (véase BBS#101010).
Instale kingbash-gb-gitAUR de AUR, luego inserte lo siguiente en su ~/.bashrc
:
function kingbash.fn() { echo -n "KingBash> $READLINE_LINE" #Where "KingBash> " se ve mejor si se parece a su PS1, al menos en longitud. OUTPUT=$(/usr/bin/kingbash "$(compgen -ab -A function)") READLINE_POINT=$(echo "$OUTPUT" | tail -n 1) READLINE_LINE=$(echo "$OUTPUT" | head -n -1) echo -ne "\r\e[2K" } bind -x '"\t":kingbash.fn'
Información IP
Información detallada sobre una dirección IP o nombre de máquina (hostname) en bash a través de https://ipinfo.io:
ipif() { if grep -P "(([1-9]\d{0,2})\.){3}(?2)" <<< "$1"; then curl ipinfo.io/"$1" else ipawk=($(host "$1" | awk '/address/ { print $NF }')) curl ipinfo.io/${ipawk[1]} fi echo }