51 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			51 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
|   | # Contributed by Noah Friedman. | ||
|  | 
 | ||
|  | # To avoid using a function in bash, you can use the `builtin' or | ||
|  | # `command' builtins, but neither guarantees that you use an external | ||
|  | # program instead of a bash builtin if there's a builtin by that name.  So | ||
|  | # this function can be used like `command' except that it guarantees the | ||
|  | # program is external by first disabling any builtin by that name.  After | ||
|  | # the command is done executing, the state of the builtin is restored.  | ||
|  | function external () | ||
|  | { | ||
|  |  local state="" | ||
|  |  local exit_status | ||
|  |    | ||
|  |     if builtin_p "$1"; then | ||
|  |        state="builtin" | ||
|  |        enable -n "$1" | ||
|  |     fi | ||
|  | 
 | ||
|  |     command "$@" | ||
|  |     exit_status=$? | ||
|  | 
 | ||
|  |     if [ "$state" = "builtin" ]; then | ||
|  |        enable "$1" | ||
|  |     fi | ||
|  | 
 | ||
|  |     return ${exit_status} | ||
|  | } | ||
|  | 
 | ||
|  | # What is does is tell you if a particular keyword is currently enabled as | ||
|  | # a shell builtin.  It does NOT tell you if invoking that keyword will | ||
|  | # necessarily run the builtin.  For that, do something like | ||
|  | # | ||
|  | #       test "$(builtin type -type [keyword])" = "builtin" | ||
|  | # | ||
|  | # Note also, that disabling a builtin with "enable -n" will make builtin_p | ||
|  | # return false, since the builtin is no longer available. | ||
|  | function builtin_p () | ||
|  | { | ||
|  |  local word | ||
|  | 
 | ||
|  |     set $(builtin type -all -type "$1") | ||
|  | 
 | ||
|  |     for word in "$@" ; do | ||
|  |        if [ "${word}" = "builtin" ]; then | ||
|  |           return 0 | ||
|  |        fi | ||
|  |     done | ||
|  | 
 | ||
|  |     return 1 | ||
|  | } |