通过.bashrc创建bash别名

时间:2011-09-23 20:50:05

标签: bash shell

作为一个系统管理员,我经常将rdp和ssh放入远程机器进行管理。

我创建了一个文件$ {SERVER_FILE},每行包含一个条目,注意连接到给定服务器时要使用的主机名和协议。

示例:

...
server1,ssh
winsrv,rdp
...

鉴于以上条目,我希望创建+评估以下内容(rdp本身就是我系统上的脚本):

alias server1='ssh server1' winsrv='rdp winsrv'

以下代码,当我将结果输出剪切并粘贴到alias命令时,可以完美地运行:

$ echo $(sed "s/\(.*\),\(rdp\|ssh\)/\1='\2 \1' /g" ${SERVER_FILE} | tr -d '\n')
server1='ssh server1' winsrv='rdp winsrv'

$ alias server1='ssh server1' winsrv='rdp winsrv'

$ alias
alias server1='ssh server1'
alias winsrv='rdp winsrv'

所以我把它更改为实际导致创建别名并且我得到错误:

$ alias $(sed "s/\(.*\),\(rdp\|ssh\)/\1='\2 \1' /g" ${SERVER_FILE} | tr -d '\n')
bash: alias: server1': not found
bash: alias: winsrv': not found

$ alias 
alias server1=''\''ssh'
alias winsrv=''\''rdp'

么?

3 个答案:

答案 0 :(得分:2)

尝试:

 $ eval alias $(sed "s/\(.*\),\(rdp\|ssh\)/\1='\2 \1' /g" ${SERVER_FILE} | tr -d '\n')

适合我。

答案 1 :(得分:1)

我可以建议使用awk而不是sed来获得更容易阅读的命令吗?

awk 'BEGIN { FS="," 
             format = "%s=\"%s %s\" " }
     $2 ~ /(rdp|ssh)/ { printf format, $1, $2, $1 }' ${SERVER_FILE}

答案 2 :(得分:0)

好吧,看起来aliasecho正在以不同的方式解释一些反斜杠。这无疑是一个黑客,但我会尝试这个:

alias $(echo $(sed "s/\(.*\),\(rdp\|ssh\)/\1='\2 \1' /g" ${SERVER_FILE} | tr -d '\n'))

: - )

相关问题