首页 > 解决方案 > 使用 for 循环 (bash_profile) 创建别名

问题描述

我正在尝试在我的 .bash_profile 中创建一个 for 循环,以遍历我的 github 文件夹中的所有目录并创建一个别名以在项目工作区中打开。

我在下面有一个工作脚本,但是每个别名都绑定到最后一个结果。

例如,如果目录包含: dir1 dir2 dir3

最终的别名如下所示:

op_dir1='cd ~/Documents/GitHub/dir3 && open . && atom .' 
op_dir2='cd ~/Documents/GitHub/dir3 && open . && atom .'
op_dir3='cd ~/Documents/GitHub/dir3 && open . && atom .'

这是初始代码:

# Git Directories Init
for d in ~/Documents/GitHub/*
do
    echo ${d##*/} && alias op_${d##*/}='cd $d && open . && atom .'
done

标签: bashshell

解决方案


问题是您正在单引号$d并延迟其扩展,直到运行别名。当您定义别名时,您希望它立即被扩展。

在 bash 中,alias是一个内置的 shell,它接受一个形式为key=value. 的单个参数alias在第一个符号处拆分,因此如果您的目录包含该字符=,此脚本仍然有效。=

但是,如果您的一个目录中有一个'字符,它将中断。

for d in ~/Documents/Github/*
do
    dir="${d##*/}"
    alias "op_${dir}=cd '$d' && open . && atom ."
done

由于cd将您的外壳程序添加到新目录,在 Finder 中打开目录并在 Atom 中打开它都是独立的事情,我建议您执行以下操作

for d in ~/Documents/Github/*
do
    dir="${d##*/}"
    alias "op_${dir}=cd '$d' && open '$d' && atom '$d'"
done

推荐阅读