Jump to content
From ArchWiki
< Bash (Español)
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]
Category:

- Command-line shells (Español)