Ejecutando el comando de cadena de alias

Ejecutando el comando de cadena de alias

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:

  1. 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.

  2. Estás corriendo aliasen subshell. Bash ejecuta comandos canalizados en un subshell (a menos que lastpipeesté configurado). Pero no necesitas la tubería (ni findninguna de las dos). Puedes usar globos regulares (que ya estás usando, por lo que findtiene 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)

información relacionada