Bash (Español)/Functions (Español)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Estado de la traducción: esta traducción de Bash/Functions fue revisada el 2020-12-08. Si existen cambios puede actualizarla o avisar al equipo de traducción.

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"
}
Nota: Asegúrese de que 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
}
Nota: Bash está limitado a expresiones regulares extendidas; este ejemplo utiliza expresiones regulares perl con grep. [1]