2013-02-07 55 views
3

我想寫一個快速的bash腳本來發信號通過腳本檢測到的某個條件下的程序,並強制使用習慣我使用一些bin utils的完整路徑,即/bin/rm/bin/kill代替rmkill。隨着特別kill,不過,我注意到在有效的信號,我可以送一個區別,它的困惑我:爲什麼/ bin/kill的有效信號與kill不同?

[[email protected]]# which kill 
/bin/kill 

[[email protected]]# /bin/kill -l 
HUP INT QUIT ILL ABRT FPE KILL SEGV PIPE ALRM TERM USR1 USR2 CHLD CONT 
STOP TSTP TTIN TTOU TRAP IOT BUS SYS STKFLT URG IO POLL CLD XCPU XFSZ 
VTALRM PROF PWR WINCH UNUSED 

[[email protected]]# kill -l 
1) SIGHUP  2) SIGINT  3) SIGQUIT  4) SIGILL 
5) SIGTRAP  6) SIGABRT  7) SIGBUS  8) SIGFPE 
9) SIGKILL  10) SIGUSR1  11) SIGSEGV  12) SIGUSR2 
13) SIGPIPE  14) SIGALRM  15) SIGTERM  16) SIGSTKFLT 
17) SIGCHLD  18) SIGCONT  19) SIGSTOP  20) SIGTSTP 
21) SIGTTIN  22) SIGTTOU  23) SIGURG  24) SIGXCPU 
25) SIGXFSZ  26) SIGVTALRM 27) SIGPROF  28) SIGWINCH 
29) SIGIO  30) SIGPWR  31) SIGSYS  34) SIGRTMIN 
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 
63) SIGRTMAX-1 64) SIGRTMAX 

我沒有任何別名殺或者:

[[email protected]]# alias 
alias cp='cp -i' 
alias l.='ls -d .* --color=tty' 
alias ll='ls -l --color=tty' 
alias ls='ls --color=tty' 
alias mv='mv -i' 
alias rm='rm -i' 
alias vi='vim' 
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' 

顯然修正是隻使用kill,但爲什麼他們不同,如​​果which kill無論如何解析爲/bin/kill

回答

7

kill是bash內置的。不幸的是,bash沒有內置的which(如zsh,它立即告訴我kill是一個內置的shell命令),並且/usr/bin/which無法知道你的shell內建函數。 (我希望bash有一些相當於快速檢查命令是否內置的東西,但成功help kill已足夠用於交互式使用)。

正如評論所解釋的@chepner,type -a COMMAND可以用來獲得對COMMAND可用變種的列表:內置插件,別名,函數和二進制文件在任何目錄上PATH

$ type -a kill 
kill is a shell builtin 
kill is /bin/kill 
+5

在''bash''中,'type -a CMD'告訴你所有可用的'CMD':'PATH'中的內建函數,別名,函數和* any *目錄。在我的一個Linux機器上,它將'kill'報告爲內建的'/ bin/kill'和'/ usr/bin/kill'。 – chepner

+0

不錯,謝謝! 「type -a」工作得很好,我不知道「kill」是內置的。 – rutgersmike

+0

對於瑣事,它必須是內建的,讓'kill%1'獲得第一份工作的pid。 –

相關問題