免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8217 | 回复: 17
打印 上一主题 下一主题

关于: alias的限制 [复制链接]

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-27 16:43 |只看该作者 |倒序浏览
刚才看到waker版主的一个alias相关的帖子,留意了一下,发现一个alias使用时的一个限制:
alias只在当前命令行提示符下,对标准输入/键盘输入的指令起作用。在脚本里不起作用。
是不是可以这样理解/猜: alias不会被subshell继承?
#!/bin/bash
ll
(ll)
eval ll
com=ll
eval $com
echo ----------------------------------------------------------------------
ls
eval ls

运行结果:
tmp.sh: line 2: ll: command not found
tmp.sh: line 3: ll: command not found
tmp.sh: line 1: ll: command not found
tmp.sh: line 1: ll: command not found
----------------------------------------------------------------------
build_env.sh  ea.sh         kkk.sh       snap.sh       test.log-snap3  test.sh
color.sh      function2.sh  llcolor.sh   test.log-ea1  test.log-snap4  tmp.sh
draw.sh       function.sh   pwd2full.sh  test.log-ea2  test.log-snap5            #没颜色
build_env.sh  ea.sh         kkk.sh       snap.sh       test.log-snap3  test.sh
color.sh      function2.sh  llcolor.sh   test.log-ea1  test.log-snap4  tmp.sh
draw.sh       function.sh   pwd2full.sh  test.log-ea2  test.log-snap5            #没颜色


(可能精华里有提到过)这里再提醒大家一下。

[ 本帖最后由 yjh777 于 2006-4-27 17:21 编辑 ]

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
2 [报告]
发表于 2006-04-27 16:56 |只看该作者

abs中的一个例子

在脚本里就得手动的去执行alias命令了:
  
   1 #!/bin/bash
   2 # alias.sh
   3
   4 shopt -s expand_aliases
   5 # Must set this option, else script will not expand aliases.
   6
   7
   8 # First, some fun.
   9 alias Jesse_James='echo "\"Alias Jesse James\" was a 1959 comedy starring Bob Hope."'
  10 Jesse_James
  11
  12 echo; echo; echo;
  13
  14 alias ll="ls -l"
  15 # May use either single (') or double (") quotes to define an alias.
  16
  17 echo "Trying aliased \"ll\":"
  18 ll /usr/X11R6/bin/mk*   #* Alias works.
  19
  20 echo
  21
  22 directory=/usr/X11R6/bin/
  23 prefix=mk*  # See if wild card causes problems.
  24 echo "Variables \"directory\" + \"prefix\" = $directory$prefix"
  25 echo
  26
  27 alias lll="ls -l $directory$prefix"
  28
  29 echo "Trying aliased \"lll\":"
  30 lll         # Long listing of all files in /usr/X11R6/bin stating with mk.
  31 # An alias can handle concatenated variables -- including wild card -- o.k.
  32
  33
  34
  35
  36 TRUE=1
  37
  38 echo
  39
  40 if [ TRUE ]
  41 then
  42   alias rr="ls -l"
  43   echo "Trying aliased \"rr\" within if/then statement:"
  44   rr /usr/X11R6/bin/mk*   #* Error message results!
  45   # Aliases not expanded within compound statements.
  46   echo "However, previously expanded alias still recognized:"
  47   ll /usr/X11R6/bin/mk*
  48 fi  
  49
  50 echo
  51
  52 count=0
  53 while [ $count -lt 3 ]
  54 do
  55   alias rrr="ls -l"
  56   echo "Trying aliased \"rrr\" within \"while\" loop:"
  57   rrr /usr/X11R6/bin/mk*   #* Alias will not expand here either.
  58                            #  alias.sh: line 57: rrr: command not found
  59   let count+=1
  60 done
  61
  62 echo; echo
  63
  64 alias xyz='cat $0'   # Script lists itself.
  65                      # Note strong quotes.
  66 xyz
  67 #  This seems to work,
  68 #+ although the Bash documentation suggests that it shouldn't.
  69 #
  70 #  However, as Steve Jacobson points out,
  71 #+ the "$0" parameter expands immediately upon declaration of the alias.
  72
  73 exit 0

论坛徽章:
0
3 [报告]
发表于 2006-04-27 17:21 |只看该作者
子shell里面里面的alias是空的,没有任何alias

如果要有用的话,可以用source urfile.sh

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2006-04-27 17:25 |只看该作者
感觉在脚本里alias跟在脚本里定义一个变量一样,需要dot/source去执行脚本才有效果
/home/lee#cat _test.sh
#!/bin/bash
alias dddd=date
var=12345
/home/lee#chmod +x _test.sh
/home/lee#./_test.sh
/home/lee#dddd
bash: dddd: command not found
/home/lee#echo $var

/home/lee#. ./_test.sh
/home/lee#dddd
四  4月 27 17:25:26 CST 2006
/home/lee#echo $var
12345
/home/lee#alias
alias dddd='date'
/home/lee#

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2006-04-27 17:52 |只看该作者
alias的使用就是为了减少交互shell下击键的次数。在脚本中我们通常应该使用function而不是alias。
在非交互的shell中,bash并不执行一些配置文件如/etc/profile,/etc/bashrc等。如果非要使用系统预先定义的alias的话,可以这样调用你的脚本:
sh -i script
或:
sh -l script

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
6 [报告]
发表于 2006-04-27 19:42 |只看该作者
原帖由 woodie 于 2006-4-27 17:52 发表
alias的使用就是为了减少交互shell下击键的次数。在脚本中我们通常应该使用function而不是alias。
在非交互的shell中,bash并不执行一些配置文件如/etc/profile,/etc/bashrc等。如果非要使用系统预先定义的alia ...

试了,sh -i 不好用 sh -l 好用。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
7 [报告]
发表于 2006-04-27 20:01 |只看该作者
原帖由 woodie 于 2006-4-27 17:52 发表
alias的使用就是为了减少交互shell下击键的次数。在脚本中我们通常应该使用function而不是alias。
在非交互的shell中,bash并不执行一些配置文件如/etc/profile,/etc/bashrc等。如果非要使用系统预先定义的alia ...

写脚本一样要击键
我想alias与function相比最大的特点是它在命令行解析时被扩展,(这个以前咱们似乎讨论过?)
我们甚至可以用alias定义命令开头的一部分一部分而不是整个命令

  1. alias pre='LANG=C >datefile'
  2. pre date
复制代码

这个用function如何实现?
而且function一样不可以传递给subshell(除了nested subshell)

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2006-04-27 20:27 |只看该作者
既然waker兄这么有兴致,那我们不妨再抬抬杠,且不论他有何意义,也不管是否会有结果。^_^
>写脚本一样要击键
您又说了句大实话。不过一个脚本你会写几次呢?你在命令行敲ll又会有多少次呢?
>我们甚至可以用alias定义命令开头的一部分一部分而不是整个命令
>...
呵呵,你这个alias的目的难道不是为了在命令行少敲几个键么?
>这个用function如何实现?
好像很艰深的样子似的嘛!不过我可懒得去写。^_^
如果要比较功能的话,function绝对是赢家,但我原贴中的重点根本就不在这,我也无意作功能上的对比,只是讨论何种环境下哪一个更适合吧了。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
9 [报告]
发表于 2006-04-27 22:10 |只看该作者
交互环境和脚本中alias和function都有合适的应用场合,
function的功能是比较强,alias一样有独到之处
在脚本中我一样会用
alias rm='rm -i'
如果用 rm() { rm...}不是给自己下套么?

shell对两种方式的处理方式不同决定了它们的应用场合不同,但应该不是按交不交互来分的

别外再说这个不重点的
或许我会在脚本中定义一个alias
alias MY_CMD='ls'
这其实增加了击键,这种alias比实际内容还长的例子也不少,大家都傻了一把?或许“吃亏就是占便宜”
但如果类比一下c中的#define MAXNUMBER=16,其中的道理不难理解吧?
alias的意义不止是少动两下手指,就象function一样

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
10 [报告]
发表于 2006-04-28 00:04 |只看该作者
在shell贮备执行命令时,从检查顺序上说,alias排在function前面
命令优先级表
1.别名
2.关键字
3.函数
4.内置命令
5.脚本或可执行程序($PATH)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP