我正在尝试查找当前shell拥有的所有别名(在C程序中)。我尝试了system("alias")
,popen("alias", "r")
和execvp("alias", ...)
,后者根本不起作用(因为alias
是特定于shell的命令)而前两个其中的命令在子shell (sh
而不是bash
)中运行 - >在那里,别名被禁用,因为它们是在~/.bashrc
中定义的。执行bash
并阅读alias
的输出是不可能的,因为bash
只会在交互模式下转到别名定义。
如果我执行以交互模式运行bash
,我会得到一个巨大的延迟时间和一个我希望避免的提示输出。
基本上,我想要的是与time(1)
具有相似的行为。它在没有执行任何命令的情况下查找当前别名! (它只会分叉一次,也就是传递的命令)
抓取互联网无济于事。
问题:如何在当前shell 中查找所有别名?是否会出现任何可移植性问题?如果是,如何避免它们?
问候。
答案 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打印出一些时序信息。