Escribí un script simple para revisar el directorio de mi proyecto de desarrollo y agregar un alias de acceso directo para cada uno:
shopt -s dotglob #Use shopt -u dotglob to exclude hidden directories
find ~/development/* -prune -type d | while IFS= read -r d; do
cur_dir="${d##*/}"
cmd="alias ${cur_dir}=\"code $d\""
echo "executing: $cmd"
$cmd
done
Y el resultado se ve así:
executing: alias project-1="code /home/my_user/development/project-1"
./alias_for_projects.sh: line 6: alias: /home/my_user/development/project-1": not found
...
Si copio y ejecuto el comando:
alias project-1="code /home/my_user/development/project-1"
simplemente funciona... ¿Cómo soluciono mi script?
Respuesta1
Tienes dos problemas:
Es complicado correrun comando almacenado en una variable.Pero realmente no es necesario almacenar el comando en una variable. Puedes simplemente hacer
alias "${cur_dir}"="code $d"
donde corres$cmd
.Estás corriendo
alias
en subshell. Bash ejecuta comandos canalizados en un subshell (a menos quelastpipe
esté configurado). Pero no necesitas la tubería (nifind
ninguna de las dos). Puedes usar globos regulares (que ya estás usando, por lo quefind
tiene aún menos sentido).
Conjunto:
shopt -s dotglob
for d in ~/development/*/; do # trailing slash - only directories match
cur_dir="${d%/}" # strip trailing slash
cur_dir="${cur_dir##*/}"
alias "${cur_dir}"="code $d"
done
Respuesta2
Después de leer todos los comentarios, arreglé mi script así:
shopt -s dotglob #Use shopt -u dotglob to exclude hidden directories
while IFS= read -r d; do
cur_dir="${d##*/}"
#echo "${cur_dir}"="code $d"
alias "${cur_dir}"="code $d"
done <<<$(find ~/development/* -prune -type d)