执行别名字符串命令

执行别名字符串命令

我编写了一个简单的脚本来浏览我的开发项目目录并为每个目录添加一个别名快捷方式:

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 在子 shell 中运行管道命令(除非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)

相关内容