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:
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
.Sie führen dies
alias
in einer Subshell aus. Bash führt Pipe-Befehle in einer Subshell aus (sofern nichtlastpipe
festgelegt). Aber Sie benötigen die Pipe (oderfind
beides) nicht. Sie können einfach normales Globbing verwenden (was Sie bereits verwenden, sodass esfind
noch 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)