mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 06:00:54 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			244 lines
		
	
	
	
		
			8.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			244 lines
		
	
	
	
		
			8.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| #compdef ps
 | |
| 
 | |
| _ps_props() {
 | |
|   local opts
 | |
| 
 | |
|   if [[ $1 = -s ]]; then
 | |
|     shift
 | |
|     compset -P '[+-]' || _describe -t modifiers modifier \
 | |
| 	'( +:ascending\ order -:descending\ order )' -S ''
 | |
|   fi
 | |
| 
 | |
|   case $OSTYPE in
 | |
|     linux-gnu) opts=( ${${(f)"$(_call_program properties $words[1] L)"}%% *} ) ;;
 | |
|     *bsd*|dragonfly*|darwin*) opts=( $(_call_program properties $words[1] L) ) ;;
 | |
|     solaris*) opts=( ${=${(f)"$(_call_program properties $words[1] - 2>&1)"}[-3,-1]} ) ;;
 | |
|   esac
 | |
| 
 | |
|   compadd "$@" -a opts
 | |
| }
 | |
| 
 | |
| local curcontext="$curcontext" state line expl ret=1
 | |
| local short long pids
 | |
| local -a args bsd bsdarg
 | |
| local -A equivs
 | |
| 
 | |
| args=(
 | |
|   '-a[select processes with tty except session leaders]'
 | |
|   {-A,-e}'[select every process]'
 | |
|   '-d[select all processes except session leaders]'
 | |
|   '*-p+[select processes by ID]:process ID:_sequence -s , _pids'
 | |
|   '*-G+[select processes by real group]:group:_sequence -s , _groups'
 | |
|   '*-g+[select processes by effective group or session]:group:_sequence -s , _groups'
 | |
|   '*-s+[select processes by session leaders]:session leader:_sequence -s , _pids'
 | |
|   '*-t+[select processes by attached terminal]:tty:_sequence -s , _ttys -Do'
 | |
|   '*-u+[select processes by effective user]:user:_sequence -s , _users'
 | |
|   '*-U+[select processes by real user]:user:_sequence -s , _users'
 | |
|   '-o+[specify output format]:property:_sequence -s , _ps_props -'
 | |
| 
 | |
|   '-c[show scheduler properties]'
 | |
|   '-f[full listing]'
 | |
|   '-j[show session ID and process group ID]'
 | |
|   '-l[long listing]'
 | |
|   '-L[show information about each light weight process]'
 | |
|   '-y[show RSS in place of ADDR (used with -l)]'
 | |
| )
 | |
| 
 | |
| bsd=(
 | |
|   'a[include processes belonging to other users]'
 | |
|   '(j s u v X)l[output in long format]'
 | |
|   '(l s u v X)j[output in job control format]'
 | |
|   'x[include processes with no controlling terminal]'
 | |
|   '(j l s u X)v[output in virtual memory format]'
 | |
|   '*w[wide output]'
 | |
|   'L[display all format specifiers]'
 | |
|   'S[include child process data with the parent]'
 | |
|   'T[select processes attached to current terminal]'
 | |
| )
 | |
| bsdarg=(
 | |
|   '*p[select processes by ID]'
 | |
|   '*t[select processes by attached terminal]'
 | |
|   'O[specify additional output fields]'
 | |
|   'o[specify output format]'
 | |
| )
 | |
| 
 | |
| case $OSTYPE in
 | |
|   solaris2.<11->)
 | |
|     args+=(
 | |
|       '-h[select processes homed to the specified lgrp]:lgrp list'
 | |
|       '-H[show home lgroup of the process]'
 | |
|     )
 | |
|   ;|
 | |
|   solaris*)
 | |
|     args+=(
 | |
|       '-P[show processor to which the process or lwp is bound]'
 | |
|       '*-z[select processes by zone]:zone list:_sequence _zones'
 | |
|       '-Z[show zone with which process is associated]'
 | |
|     )
 | |
|   ;;
 | |
|   linux-gnu|dragonfly*|freebsd*|netbsd*|openbsd*)
 | |
|     bsd+=(
 | |
|       'e[show environment after command]'
 | |
|       '(j l s v X)u[output in resource usage format]'
 | |
|     )
 | |
|     bsdarg+=(
 | |
|       'N[set namelist file for WCHAN display]'
 | |
|       '*U[select processes by effective user]'
 | |
|     )
 | |
|   ;|
 | |
|   linux-gnu|dragonfly*|freebsd*|openbsd*)
 | |
|     bsd+=( 'H[show threads as if they were processes]' )
 | |
|   ;|
 | |
|   darwin*|dragonfly*|freebsd*|netbsd*|openbsd*)
 | |
|     bsd+=(
 | |
|       'A[select every process]'
 | |
|       'c[show just executable name for command]'
 | |
|       'h[repeat header lines, one per page of output]'
 | |
|       '(r)m[sort by memory usage]'
 | |
|       '(m)r[sort by CPU usage]'
 | |
|     )
 | |
|   ;|
 | |
|   darwin*|dragonfly*|freebsd*|netbsd*)
 | |
|     bsd+=( 'C[ignore resident time for CPU percentage]' )
 | |
|   ;|
 | |
|   dragonfly*|freebsd*|netbsd*|openbsd*)
 | |
|     bsdarg+=( 'M[extract values from specified core]' )
 | |
|   ;|
 | |
|   linux-gnu|netbsd*) bsdarg+=( 'k[specify sort order]' ) ;|
 | |
|   darwin*|freebsd*)
 | |
|     bsd+=( 'X[skip processes with no controlling terminal]' )
 | |
|     bsdarg+=( '*G[select processes by real group]' )
 | |
|   ;|
 | |
|   freebsd*|dragonfly*)
 | |
|     bsd+=( 'f[show command and environment for swapped out processes]' )
 | |
|   ;|
 | |
|   netbsd*|openbsd*)
 | |
|     bsdarg+=( 'W[extract swap information from specified file]' )
 | |
|   ;|
 | |
|   freebsd*|netbsd*)
 | |
|     bsd+=(
 | |
|       'd[show process hierarchy]'
 | |
|     )
 | |
|   ;|
 | |
|   darwin*)
 | |
|     bsd+=(
 | |
|       'd[select all processes except session leaders]'
 | |
|       'E[show environment after command]'
 | |
|       'f[full listing]'
 | |
|       'M[show threads corresponding to each process]'
 | |
|     )
 | |
|     bsdarg+=(
 | |
|       '*g[select processes by process group leader]'
 | |
|       '*U[select processes by real user]'
 | |
|     )
 | |
|     if [[ $words[CURRENT] = -* ]]; then
 | |
|       bsd+=( 'e[select every process]' )
 | |
|       bsdarg+=( 'u[select processes by user id]' )
 | |
|     else
 | |
|       bsd+=(
 | |
|         'e[show environment after command]'
 | |
|         '(j l v)u[output in resource usage format]'
 | |
|       )
 | |
|     fi
 | |
|   ;;
 | |
|   dragonfly*)
 | |
|     bsd+=( 'R[subsort by parent/child chain]' )
 | |
|   ;;
 | |
|   freebsd*)
 | |
|     bsd+=(
 | |
|       '*J[select processes by jail ID]'
 | |
|       'Z[show mac label]'
 | |
|     )
 | |
|   ;;
 | |
|   netbsd*) bsd+=( '(j l u v)s[output in thread format]' ) ;;
 | |
|   openbsd*)
 | |
|     bsd+=(
 | |
|       'k[display information about kernel threads]'
 | |
|     )
 | |
|   ;;
 | |
|   linux-gnu)
 | |
|     args+=(
 | |
|       '-O+[specify additional output fields]:property:_sequence -s , _ps_props -'
 | |
|       '(-N --deselect)'{-N,--deselect}'[negate selection: all processes except those selected]'
 | |
|       '*-C[select processes by command name]:command:_sequence -s , _command_names -e'
 | |
|       '*--ppid[select processes by parent process ID]:parent process:_sequence -S , _pids'
 | |
|       '(-f)-F[extra full format listing]'
 | |
|       '--context[show SELinux security context format]'
 | |
|       '-M[show security data]'
 | |
|       '(--forest -H)'{--forest,-H}'[show process hierarchy]'
 | |
|       '--headers[repeat header lines, one per page of output]'
 | |
|       '(--cols --columns --width)'{--cols,--columns,--width}'[set screen width]:width'
 | |
|       '(--lines --rows)'{--lines,--rows}'[set screen height]'
 | |
|       '--cumulative[include child process data with the parent]'
 | |
|       '-n[set namelist file for WCHAN display]:file:_files'
 | |
|       '(--no-headers --no-heading)'{--no-headers,--no-heading}'[suppress headers]'
 | |
|       '(-q --quick-pid -a -A -d -e -N --deselect -C -p --pid --ppid -G --Group -g --group -s --sid -t --tty -u --user -U --User --forest -H --sort)'{-q+,--quick-pid=}'[select processes by ID (quick mode)]:process ID:_sequence -s , _pids'
 | |
|       '--sort=[specify sort order]:order:_sequence -s , _ps_props -s'
 | |
|       '-w[wide output]'
 | |
|       '-m[show threads after processes]'
 | |
|       '-T[show threads, with SPID column]'
 | |
|       '-Z[show security context format (SELinux)]'
 | |
|       '(- *)--help[display help information]::subject:(simple list output threads misc all)'
 | |
|       '(- *)--info[display debugging information]'
 | |
|       '(- *)'{-V,--version}'[display version information]'
 | |
|     )
 | |
|     equivs=( G Group g group p pid s sid t tty U User u user o format )
 | |
|     for short long in ${(kv)equivs}; do
 | |
|       args+=( ${${(M)args:#(\*|)-$short*}/$short+/-$long=} )
 | |
|     done
 | |
|     bsd+=(
 | |
|       'c[show true command name]'
 | |
|       'f[show process hierarchy]'
 | |
|       'h[suppress header]'
 | |
|       'm[show threads after processes]'
 | |
|       'n[numeric output for WCHAN and USER]'
 | |
|       'r[select running processes]'
 | |
|       '(j l u v X)s[output in signal format]'
 | |
|       'V[display version information]'
 | |
|       '(j l s u v)X[output in register format]'
 | |
|       'Z[show security data]'
 | |
|     )
 | |
|     bsdarg+=( 'q[select processes by ID (quick mode)]' )
 | |
|   ;;
 | |
| esac
 | |
| 
 | |
| if (( CURRENT > 1 )) && [[ $OSTYPE != (solaris*|linux-gnu) ||
 | |
|               ( $OSTYPE = linux-gnu && $words[CURRENT-1] != -* ) ]]; then
 | |
|   case $words[CURRENT-1] in
 | |
|     *k)
 | |
|       local sopt
 | |
|       [[ $OSTYPE = linux-gnu ]] && sopt='-s'
 | |
|       _wanted -C option-k-1 properties expl 'property' \
 | |
| 		_sequence -s , _ps_props $sopt - && return ;;
 | |
|     *g) [[ $OSTYPE = darwin* ]] && _wanted -C option-g-1 processes \
 | |
| 		expl 'process ID' _sequence -s , _pids && return ;;
 | |
|     *G) _sequence -s , _groups && return ;;
 | |
|     *J) _sequence _jails -0 && return ;;
 | |
|     *[MNW]) _files && return ;;
 | |
|     *t)
 | |
|       _wanted -C option-t-1 ttys expl tty _sequence -s , _ttys -Do && return
 | |
|     ;;
 | |
|     *[pq]) _wanted -C "option-${words[CURRENT-1][-1]}-1" processes \
 | |
| 	expl 'process ID' _sequence -s , _pids && return ;;
 | |
|     *U) _wanted -C option-U-1 users expl user _sequence -s , _users && return ;;
 | |
|     *u) [[ $OSTYPE = darwin* && $words[CURRENT-1] = -* ]] && \
 | |
| 	_wanted -C option-u-1 users expl user _sequence -s , _users && return ;;
 | |
|     *[oO]) _wanted -C "option-${words[CURRENT-1][-1]}-1" properties \
 | |
|         expl 'property' _sequence -s , _ps_props - && return ;;
 | |
|   esac
 | |
| fi
 | |
| 
 | |
| if [[ $OSTYPE = (*bsd*|darwin*|dragonfly*) ]]; then
 | |
|   compset -P - && pids=1
 | |
| else
 | |
|   [[ $OSTYPE = solaris* ]] || args+=( '*:: :->rest' )
 | |
|   _arguments -C -s $args && ret=0
 | |
|   [[ -z "$state" ]] && return ret
 | |
| fi
 | |
| 
 | |
| _values -s '' -S ' ' 'options' $bsd && ret=0
 | |
| _values -S ' ' 'options' $bsdarg && ret=0
 | |
| if [[ -z $pids ]]; then
 | |
|   _pids && ret=0
 | |
| fi
 | |
| return ret
 |