Ausführen des Alias-String-Befehls

Ausführen des Alias-String-Befehls

Ich habe ein einfaches Skript geschrieben, um mein Entwicklungsprojektverzeichnis zu durchsuchen und für jedes eine Aliasverknüpfung hinzuzufügen:

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

Und die Ausgabe sieht folgendermaßen aus:

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

Wenn ich den Befehl kopiere und ausführe:

alias project-1="code /home/my_user/development/project-1"

es funktioniert einfach ... Wie repariere ich mein Skript?

Antwort1

Sie haben zwei Probleme:

  1. Es ist schwierig zu laufenein in einer Variablen gespeicherter Befehl.Sie müssen den Befehl aber nicht unbedingt in einer Variablen speichern. Sie können ihn einfach dort ausführen, alias "${cur_dir}"="code $d"wo Sie ihn ausführen $cmd.

  2. Sie führen dies aliasin einer Subshell aus. Bash führt Pipe-Befehle in einer Subshell aus (sofern nicht lastpipefestgelegt). Aber Sie benötigen die Pipe (oder findbeides) nicht. Sie können einfach normales Globbing verwenden (was Sie bereits verwenden, sodass es findnoch weniger Sinn ergibt).

Kombiniert:

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

Antwort2

Nachdem ich alle Kommentare gelesen hatte, habe ich mein Skript wie folgt korrigiert:

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)

verwandte Informationen