Выполнение команды строки псевдонима

Выполнение команды строки псевдонима

Я написал простой скрипт для обхода каталога моих проектов разработки и добавления ярлыка-псевдонима для каждого из них:

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

И вывод выглядит так:

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

Если я скопирую и выполню команду:

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

он просто работает... Как мне исправить мой скрипт?

решение1

У вас две проблемы:

  1. Трудно бежатькоманда, сохраненная в переменной.Но вам не обязательно сохранять команду в переменной. Вы можете просто сделать это alias "${cur_dir}"="code $d"там, где вы запускаете $cmd.

  2. Вы работаете aliasв подоболочке. Bash запускает конвейерные команды в подоболочке (если не lastpipeустановлено). Но вам не нужен конвейер (или findчто-то еще). Вы можете просто использовать обычную подстановку (которую вы уже используете, так что это findимеет еще меньше смысла).

В совокупности:

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

решение2

Прочитав все комментарии, я исправил свой скрипт следующим образом:

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)

Связанный контент