【问题标题】:C: List aliases of current shell (not subshell!)C:列出当前shell的别名(不是子shell!)
【发布时间】:2013-06-28 08:26:03
【问题描述】:

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

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

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

上网无济于事。

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

问候。

【问题讨论】:

    标签: c shell posix bash


    【解决方案1】:

    我刚刚在我的 Mac 上下载并构建了 GNU time。令我惊讶和懊恼的是,它不会从父 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。一个非常翔实的帖子。我注意到的另一件事:time 只会在bash 中扩展别名,而不是在sh 中。所以它也可能是bash 特有的行为。 bash 可能正在侦听可以处理 alias 请求(或任何与此相关的请求)的套接字?不过,我在互联网/我的本地电脑上没有找到任何迹象。这个有点棘手……希望有人能进一步启发我们。
    • 刚刚也意识到了这一点。太糟糕了,我们对 time 不是可执行文件而是 bash 命令的歧义感到困惑。哎呀,我的希望来了!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-10
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多