动态Bash别名

时间:2015-09-18 20:43:42

标签: bash eval alias

我正在尝试动态定义我的别名,但我必须做错事......

我有一个名为hosts.txt的文件。这是格式:

#shortname,host,account
h1,host1.somewhere.com,acc1
h2,host2.somewhere.com,acc1
h3,host3.somewhere.com,acc1

在我的bash_profile中我有以下代码

grep -v '^#' hosts.txt | while read line;do
    DATA=(${line//,/ })
    cmd="${DATA[0]}=\"ssh ${DATA[2]}@${DATA[1]}\""
    eval $cmd
done

当我登录时,我希望看到我的别名定义如下

alias h1=ssh acc1@hos1
alias h2=ssh acc1@hos2
alias h3=ssh acc1@hos3

但我不知道如何实现这个目标?

恢复正确的方式: 别名不能使用while循环动态定义,因为它在子shell中运行,因此它定义的内容永远不会使我们成为父shell。这就是问题所在...... 一旦我移动了它的forloop就可以了。

1 个答案:

答案 0 :(得分:2)

ssh配置文件已经可以定义基本上与您尝试执行的操作相同的主机名别名。在~/.ssh/config中,添加

Host h1
    HostName host1.somewhere.com
    User acc1

Host h2
    HostName host2.somewhere.com
    User acc1

Host h3
    HostName host3.somewhere.com
    User acc1

然后,您只需键入ssh h1作为ssh acc1@host1.somewhere.com的快捷方式即可。如果确实仍然需要更短的别名,只需将以下内容添加到.bash_profile

for h in h1 h2 h3; do
    alias $h="ssh $h"
done

对于您只需要在两个配置文件中输入一次的内容,尝试进一步自动化并不值得。只是对它们进行硬编码。但是,如果你必须:

while read _ host; do
    alias $host="ssh $host"
done < <(grep "Host " ~/.ssh/config)