[英]C: List aliases of current shell (not subshell!)
我正在嘗試找到當前shell擁有的所有別名(在C程序中)。 我已經嘗試過system("alias")
, popen("alias", "r")
和execvp("alias", ...)
,后者根本不起作用(因為alias
是shell-特定的命令),前兩個在子shell中運行該命令( sh
而不是bash
) - >那里,別名被禁用,因為它們在我的~/.bashrc
中定義。 執行bash
並讀取alias
的輸出是不可能的,因為bash
只會在交互模式下轉到別名定義。
如果我不運行bash
交互模式下,我得到了巨大的延遲時間,而且我希望避免提示輸出。
基本上,我想要的是與time(1)
具有相似的行為。 它在沒有執行任何命令的情況下查找當前別名! (它只會分叉一次,也就是傳遞給命令)
爬網沒有用。
問題:如何在當前shell中查找所有別名 ? 是否會出現任何可移植性問題? 如果是,如何避免它們?
問候。
我剛下載並在我的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內置命令。
你不能。 time是內置的,它可以訪問內部存儲到正在運行的shell實例的別名。 如果你需要弄清楚shell將執行什么,你需要運行類似的東西。
時間沒有做任何聰明或秘密。 它只是命令的前綴,使shell打印出一些時序信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.