}
# 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
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/^.*[[:space:]][[:space:]]*\([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]*[[:space:]][[:space:]]*\([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.
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 "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
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.
# 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
}
- # switches from an X:/ form to an /X/path form.
+ # switches from an X:/ form to a /cygdrive/X/path form. this is only useful
+ # for the cygwin environment currently.
function dos_to_unix_path() {
# we always remove dos slashes in favor of forward slashes.
- echo "$1" | sed -e 's/\\/\//g' | sed -e 's/\([a-zA-Z]\):\/\(.*\)/\/\1\/\2/'
+#old: echo "$1" | sed -e 's/\\/\//g' | sed -e 's/\([a-zA-Z]\):\/\(.*\)/\/\1\/\2/'
+ echo "$1" | sed -e 's/\\/\//g' | sed -e 's/\([a-zA-Z]\):\/\(.*\)/\/cygdrive\/\1\/\2/'
}
# returns a successful value (0) if this system is debian or ubuntu.
echo "failure to find a file or directory named '$arg'."
continue
fi
+
+ # first we will capture the output of the character replacement operation for reporting.
+ # this is done first since some filenames can't be properly renamed in perl (e.g. if they
+ # have pipe characters apparently).
+ intermediate_name="$(bash "$FEISTY_MEOW_SCRIPTS/files/replace_spaces_with_underscores.sh" "$arg")"
+ if [ -z "$intermediate_name" ]; then
+ # make sure we report something, if there are no further name changes.
+ intermediate_name="'$arg'"
+ else
+ # now zap the first part of the name off (since original name isn't needed).
+ intermediate_name="$(echo $intermediate_name | sed -e 's/.*=> //')"
+ fi
+
# first we rename the file to be lower case.
- perl $FEISTY_MEOW_SCRIPTS/files/renlower.pl "$arg" &>/dev/null
- # oops, now the name is all lower-case. we need to make the
- # same adjustment.
- arg2="$(echo "$arg" | tr A-Z a-z)"
- # 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")"
- # now zap the intermediate part of the name off.
- final_name="$(echo $final_name | sed -e 's/.*=> //')"
+ actual_file="$(echo $intermediate_name | sed -e "s/'\([^']*\)'/\1/")"
+ final_name="$(perl $FEISTY_MEOW_SCRIPTS/files/renlower.pl "$actual_file")"
+ if [ -z "$final_name" ]; then
+ final_name="'$intermediate_name'"
+ else
+ final_name="$(echo $final_name | sed -e 's/.*=> //')"
+ fi
+
# printout the combined operation results.
echo "'$arg' => $final_name"
done
##############
+# 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