C:列出当前shell的别名(不是子shell!)

时间:2013-07-01 09:02:15

标签: c shell posix bash

我正在尝试查找当前shell拥有的所有别名(在C程序中)。我尝试了system("alias")popen("alias", "r")execvp("alias", ...),后者根本不起作用(因为alias是特定于shell的命令)而前两个其中的命令在子shell sh而不是bash)中运行 - >在那里,别名被禁用,因为它们是在~/.bashrc中定义的。执行bash并阅读alias的输出是不可能的,因为bash只会在交互模式下转到别名定义。

如果我执行以交互模式运行bash,我会得到一个巨大的延迟时间和一个我希望避免的提示输出。

基本上,我想要的是与time(1)具有相似的行为。它在没有执行任何命令的情况下查找当前别名! (它只会分叉一次,也就是传递的命令)

抓取互联网无济于事。

问题:如何在当前shell 中查找所有别名?是否会出现任何可移植性问题?如果是,如何避免它们?

问候。

2 个答案:

答案 0 :(得分:2)

我刚刚在Mac上下载并构建了GNU时间。让我感到惊讶和懊恼的是,它不会从父bash中读取别名,而内置的time会这样做。

$ alias frodo=ls
$ ./time frodo
./time: cannot run frodo: No such file or directory
Command exited with non-zero status 127
0.00user 0.00system 0:00.00elapsed ?%CPU (0avgtext+0avgdata 819200maxresident)k
0inputs+0outputs (0major+59minor)pagefaults 0swaps
$ time frodo
AUTHORS    INSTALL      Makefile.in  config.cache    configure*    error.o   getopt.o   getpagesize.h  mkinstalldirs*  resuse.h  stamp-vti    time.c     time.texi  version.texi
COPYING    Makefile     NEWS         config.log      configure.in  getopt.c  getopt1.c  install-sh*    port.h          resuse.o  texinfo.tex  time.info  version.c  wait.h
ChangeLog  Makefile.am  README       config.status*  error.c       getopt.h  getopt1.o  mdate-sh*      resuse.c        stamp-v   time*        time.o     version.o

real    0m0.005s
user    0m0.002s
sys 0m0.002s
$

我怀疑在桌面下面有一些未记录的内容,以帮助内置time看到别名(或BSD提供GNU时间不会或不能使用的东西)。

编辑: Tom Tanner的回答(+1 Tom)提示,我刚才意识到time frodo没有调用/usr/bin/time(正如which time所建议的那样),并且显式运行/usr/bin/time frodo也会失败,因此必须单独输入time来调用bash内置命令。

答案 1 :(得分:2)

你做不到。 time是内置的,它可以访问内部存储到正在运行的shell实例的别名。如果你需要弄清楚shell将执行什么,你需要运行类似的东西。

时间没有做任何聪明或秘密的事情。它只是命令的前缀,使shell打印出一些时序信息。