1

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

如果我确实在交互模式下运行bash,我会得到一个巨大的延迟时间和一个我想要避免的提示输出。

基本上,我想要的是具有与time(1). 它甚至不执行任何命令就查找当前别名!(它只会分叉一次,即对于传递的命令)

爬网是无济于事的。

问题:如何查找当前 shell中的所有别名?会不会有便携性问题?如果是,如何避免它们?

问候。

4

2 回答 2

2

我刚刚在我的 Mac 上下载并构建了 GNU time。令我惊讶和懊恼的是,它不会从父 bash 中读取别名,而内置 bashtime会。

$ 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 内置命令。

于 2013-07-01T09:35:54.623 回答
2

你不能。time 是内置的,它可以访问在内部存储到正在运行的 shell 实例的别名。如果您需要确定 shell 将执行什么,您需要运行 which 或类似的东西。

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

于 2013-07-01T10:01:33.530 回答