X-Git-Url: https://feistymeow.org/gitweb/?a=blobdiff_plain;f=scripts%2Fcore%2Ffunctions.sh;h=ed5d19193c1f6eb5c7ecde332161d109f7e1a4c1;hb=d3f90950a4a837077724fbb990b90103202e2bf5;hp=d098f8e7461e19def5bffb7752b086183919f62f;hpb=2c8ab3825d321561c22e4759ed7d70d9bc50877e;p=feisty_meow.git diff --git a/scripts/core/functions.sh b/scripts/core/functions.sh index d098f8e7..ed5d1919 100644 --- a/scripts/core/functions.sh +++ b/scripts/core/functions.sh @@ -105,12 +105,35 @@ if [ -z "$skip_all" ]; then } # locates a process given a search pattern to match in the process list. + # supports a single command line flag style parameter of "-u USERNAME"; + # if the -u flag is found, a username is expected afterwards, and only the + # processes of that user are considered. function psfind() { local -a patterns=("${@}") +#echo ==== +#echo patterns list is: "${patterns[@]}" +#echo ==== + + local user_flag + if [ "${patterns[0]}" == "-u" ]; then + user_flag="-u ${patterns[1]}" +#echo "found a -u parm and user=${patterns[1]}" + # void the two elements with that user flag so we don't use them as patterns. + unset patterns[0] patterns[1]= + else + # select all users. + user_flag="-e" + fi + local PID_DUMP="$(mktemp "$TMP/zz_pidlist.XXXXXX")" local -a PIDS_SOUGHT if [ "$OS" == "Windows_NT" ]; then - # needs to be a windows format filename for 'type' to work. + +#hmmm: windows isn't implementing the user flag yet! +#try collapsing back to the ps implementation from cygwin? +# that would simplify things a lot, if we can get it to print the right output. + + # windows case has some odd gyrations to get the user list. if [ ! -d c:/tmp ]; then mkdir c:/tmp fi @@ -126,27 +149,41 @@ if [ -z "$skip_all" ]; then flag='//c' fi # we 'type' the file to get rid of the unicode result from wmic. + # needs to be a windows format filename for 'type' to work. cmd $flag type "$tmppid" >$PID_DUMP \rm "$tmppid" - local appropriate_pattern="s/^.* *\([0-9][0-9]*\) *\$/\1/p" + local pid_finder_pattern='s/^.*[[:space:]][[:space:]]*\([0-9][0-9]*\) *\$/\1/p' + local i for i in "${patterns[@]}"; do PIDS_SOUGHT+=($(cat $PID_DUMP \ | grep -i "$i" \ - | sed -n -e "$appropriate_pattern")) + | sed -n -e "$pid_finder_pattern")) done else - /bin/ps $extra_flags wuax >$PID_DUMP + /bin/ps $user_flag -o pid,args >$PID_DUMP +#echo ==== +#echo got all this stuff in the pid dump file: +#cat $PID_DUMP +#echo ==== # pattern to use for peeling off the process numbers. - local appropriate_pattern='s/^[-a-zA-Z_0-9][-a-zA-Z_0-9]* *\([0-9][0-9]*\).*$/\1/p' + local pid_finder_pattern='s/^[[:space:]]*\([0-9][0-9]*\).*$/\1/p' # remove the first line of the file, search for the pattern the # user wants to find, and just pluck the process ids out of the # results. + local i for i in "${patterns[@]}"; do +#echo pattern is $i +#echo phase 1: $(cat $PID_DUMP | sed -e '1d' ) +#echo phase 2: $(cat $PID_DUMP | sed -e '1d' | grep -i "$i" ) PIDS_SOUGHT+=($(cat $PID_DUMP \ | sed -e '1d' \ | grep -i "$i" \ - | sed -n -e "$appropriate_pattern")) + | sed -n -e "$pid_finder_pattern")) done +#echo ==== +#echo pids sought list became: +#echo "${PIDS_SOUGHT[@]}" +#echo ==== fi if [ ${#PIDS_SOUGHT[*]} -ne 0 ]; then local PIDS_SOUGHT2=$(printf -- '%s\n' ${PIDS_SOUGHT[@]} | sort | uniq) @@ -164,13 +201,20 @@ if [ -z "$skip_all" ]; then echo "psa finds processes by pattern, but there was no pattern on the command line." return 1 fi - p=$(psfind "${@}") + local -a patterns=("${@}") + p=$(psfind "${patterns[@]}") if [ -z "$p" ]; then # no matches. return 0 fi + + if [ "${patterns[0]}" == "-u" ]; then + # void the two elements with that user flag so we don't use them as patterns. + unset patterns[0] patterns[1]= + fi + echo "" - echo "Processes matching ${@}..." + echo "Processes matching ${patterns[@]}..." echo "" if [ -n "$IS_DARWIN" ]; then unset fuzil_sentinel @@ -185,13 +229,11 @@ if [ -z "$skip_all" ]; then done else # cases besides mac os x's darwin. - extra_flags= - if [ "$OS" = "Windows_NT" ]; then + if [ "$OS" == "Windows_NT" ]; then # special case for windows. - extra_flags=-W ps | head -1 for curr in $p; do - ps $extra_flags | grep "$curr" + ps -W | grep "$curr" done else # normal OSes can handle a nice simple query. @@ -220,11 +262,22 @@ if [ -z "$skip_all" ]; then # switches from a /X/path form to an X:/ form. this also processes cygwin paths. function unix_to_dos_path() { # we usually remove dos slashes in favor of forward slashes. + local DOSSYHOME + if [[ ! "$OS" =~ ^[Ww][iI][nN] ]]; then + # fake this value for non-windows (non-cygwin) platforms. + DOSSYHOME="$HOME" + else + # for cygwin, we must replace the /home/X path with an absolute one, since cygwin + # insists on the /home form instead of /c/cygwin/home being possible. this is + # super frustrating and nightmarish. + DOSSYHOME="$(cygpath -am "$HOME")" + fi + if [ ! -z "$SERIOUS_SLASH_TREATMENT" ]; then # unless this flag is set, in which case we force dos slashes. - echo "$1" | sed -e 's/\\/\//g' | sed -e 's/\/cygdrive//' | sed -e 's/\/\([a-zA-Z]\)\/\(.*\)/\1:\/\2/' | sed -e 's/\//\\/g' + echo "$1" | sed -e "s?^$HOME?$DOSSYHOME?g" | sed -e 's/\\/\//g' | sed -e 's/\/cygdrive//' | sed -e 's/\/\([a-zA-Z]\)\/\(.*\)/\1:\/\2/' | sed -e 's/\//\\/g' else - echo "$1" | sed -e 's/\\/\//g' | sed -e 's/\/cygdrive//' | sed -e 's/\/\([a-zA-Z]\)\/\(.*\)/\1:\/\2/' + echo "$1" | sed -e "s?^$HOME?$DOSSYHOME?g" | sed -e 's/\\/\//g' | sed -e 's/\/cygdrive//' | sed -e 's/\/\([a-zA-Z]\)\/\(.*\)/\1:\/\2/' fi } @@ -425,7 +478,11 @@ if [ -z "$skip_all" ]; then # we definitely wanted to adjust the case first, rather than doing all # the wacky stuff this script does to the filename... we will capture # the output of the replace operaton for reporting. - final_name="$(perl "$FEISTY_MEOW_SCRIPTS/files/replace_spaces_with_underscores.sh" "$arg2")" + final_name="$(bash "$FEISTY_MEOW_SCRIPTS/files/replace_spaces_with_underscores.sh" "$arg2")" + if [ -z "$final_name" ]; then + # make sure we report something, if there are no further name changes. + final_name="$arg2" + fi # now zap the intermediate part of the name off. final_name="$(echo $final_name | sed -e 's/.*=> //')" # printout the combined operation results. @@ -435,6 +492,48 @@ if [ -z "$skip_all" ]; then ############## +# new breed of definer functions goes here. still in progress. + + # defines an alias and remembers that this is a new or modified definition. + # if the feisty meow codebase is unloaded, then so are all the aliases that + # were defined. + function define_yeti_alias() + { +# if alias exists already, save old value for restore, +# otherwise save null value for restore, +# have to handle unaliasing if there was no prior value of one +# we newly defined. +# add alias name to a list of feisty defined aliases. + +#hmmm: first implem, just do the alias and get that working... +alias "${@}" + + +return 0 + } + + # defines a variable within the feisty meow environment and remembers that + # this is a new or modified definition. if the feisty meow codebase is + # unloaded, then so are all the variables that were defined. + # this function always exports the variables it defines. + function define_yeti_variable() + { +# if variable exists already, save old value for restore, +# otherwise save null value for restore, +# have to handle unsetting if there was no prior value of one +# we newly defined. +# add variable name to a list of feisty defined variables. + +#hmmm: first implem just sets it up and exports the variable. +# i.e., this method always exports. +export "${@}" + + +return 0 + } + + ############## + function function_sentinel() { return 0; } if [ ! -z "$SHELL_DEBUG" ]; then echo "feisty meow function definitions done."; fi