Las variables Bash se pueden usar para crear un sistema de marcadores. Las variables funcionarán con cualquier comando y bash completará con pestañas el nombre de la variable. En las versiones más nuevas de bash, si se agrega un / al nombre de la variable, la ruta que contiene la variable también se puede completar con pestañas.
mydir=/home/chris/dir
ls $my # Tab completion works on variable name.
ls $mydir/ # Tab completion is equivalent to that with ls /home/chris/dir/
# (doesn't work in older versions of bash).
Por persistencia, las declaraciones de variables se pueden guardar en un archivo que se obtiene de .bashrc. Dado que este archivo es un script bash, puede contener declaraciones que hacen referencia a otras variables, como aur="${HOME}/AUR"
, o que solo se ejecutan en ciertos hosts if [[ $HOSTNAME == foo ]]; then bar=baz; fi
, lo que es útil si reutiliza archivos de configuración en varios hosts y usuarios.
La siguiente función bash (que se agregará a .bashrc o se obtendrá de ella) permite agregar y eliminar marcadores del archivo de marcadores. Es bastante nuevo y no se garantiza que esté libre de errores.
bookmark_file=~/.bookmarks
source "$bookmark_file"
bm() {
usage='Usage:
bm add <name> <path> Create a bookmark for path.
bm add <name> Create a bookmark for the current directory.
bm update Source the bookmark file.
bm remove <name> Remove a bookmark'
case $1 in
add)
local path
if [[ $# -eq 2 ]]; then
path=.
elif [[ $# -eq 3 ]]; then
if [[ -e $3 ]]; then
path="$3"
else
echo "bm: ${3}: No such file or directory."
return 1
fi
else
echo "$usage"
return 1
fi
if declare | grep "^${2}=" > /dev/null; then
echo "bm: The name $2 is in use."
return 1
fi
path=$(readlink -f "$path")
echo ${2}=\""$path"\" >> "$bookmark_file"
eval ${2}=\""$path"\"
return 0
;;
update)
if [[ $# -eq 1 ]]; then
source "$bookmark_file"
return 0
fi
;;
remove)
if [[ $# -eq 2 ]]; then
unset $2
local contents=$(grep -v "^${2}=" "$bookmark_file")
echo "$contents" > "${bookmark_file}.tmp"
rm -f "$bookmark_file"
mv "${bookmark_file}.tmp" "$bookmark_file"
return 0
fi
;;
esac
echo "$usage"
return 1
}