如何使用bash脚本从用户输入定义别名?

时间:2012-03-18 15:41:26

标签: bash shell ubuntu alias

我希望这个问题的答案已经存在,但是我无法找到它。我浪费了太多时间搞乱这个。最好只是询问并继续前进。

我正在尝试创建一个(bash)shell脚本,在运行时将提示别名和替换字符串的名称,然后创建该别名。因此,作为工具棚中最尖锐的工具,我尝试(实际上从博客中复制)下面的代码。

#!/bin/bash
echo "Enter the identifier for the alias (shortcut)"
read SHORTTEXT
echo "Now enter the string which $SHORTTEXT will alias:"
read LONGTEXT
alias $SHORTTEXT='$LONGTEXT'

我将上面的代码放入文件~/scripts/nojoy.sh,使文件可执行,然后尝试了。

myid@myid:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 11.10
Release:    11.10
Codename:   oneiric
myid@myid:~$
myid@myid:~$ . ~/scripts/nojoy.sh 
Enter the identifier for the alias (shortcut)
testit
Now enter the string which testit will alias:
cd ~
myid@myid:~$ alias testit
alias testit='$LONGTEXT'
然后,我花了更多的时间,而不是承认试图修改明显的错误 alias $SHORTTEXT='$LONGTEXT'
在运行脚本时会导致创建的内容 alias testit='cd ~'
当脚本运行时。

我放弃了。有人可以直接向我解释如何做到这一点,这样我可以继续做一些比这更重要的事情吗? (比如清洁垃圾箱可能吗?)


更新

我没想到会为此找到答案。但这两个答案都有效,尽管方式不同,而且我不确定我是否理解可能出现的任何微妙之处。

在我的脚本文件中使用alias $SHORTTEXT="$LONGTEXT"和输入字符串
find . -name '*.txt'
导致了 alias test='find . -name '\''*.txt'\'''

使用eval "alias $SHORTTEXT='$LONGTEXT'"导致了 alias test='find . -name *.txt'

我决定我对shell脚本定义的别名应该做的天真期望归结为纯文本替换。也就是说,如果我定义了一个名为的别名 对于example echo '*.txt',当我使用它时,我希望结果为*.txt

在第一个答案中使用该方法可以做到这一点。第二个答案没有。所以我选择了第一个答案,接近我认为我正在寻找的东西。

感谢所有人!

2 个答案:

答案 0 :(得分:1)

您可以使用eval:

~$ eval "alias lion='ls -la'"
~$ lion
total 2393924

其他一些例子:

~$ a=findtxt
~$ b="find . -name '*.txt'"
~$ eval "alias $a='$b'"

答案 1 :(得分:1)

你得到的是单引号:

alias $SHORTTEXT='$LONGTEXT'

的需求。如果您希望展开$LONGTEXT,请使用:

alias $SHORTTEXT="$LONGTEXT"