X-Git-Url: https://feistymeow.org/gitweb/?a=blobdiff_plain;f=scripts%2Fcore%2Ffunctions.sh;h=7edaa007b40b16e12b9075f5415a4a3a70bcc383;hb=609b705e54bef599d06151cbcb10da415918ff42;hp=d6beda886cd5326e00e268dc87d839eda5d165a6;hpb=140849126a852d59c52670fd1e254f198829be29;p=feisty_meow.git diff --git a/scripts/core/functions.sh b/scripts/core/functions.sh index d6beda88..7edaa007 100644 --- a/scripts/core/functions.sh +++ b/scripts/core/functions.sh @@ -78,6 +78,17 @@ if [ -z "$skip_all" ]; then IFS="$HOLDIFS" } + # sets the variable in parameter 1 to the value in parameter 2, but only if + # that variable was undefined. + function set_var_if_undefined() + { + local var_name="$1"; shift + local var_value="$1"; shift + if [ -z "${!var_name}" ]; then + eval export $var_name="$var_value" + fi + } + function success_sound() { if [ ! -z "$CLAM_FINISH_SOUND" ]; then @@ -127,64 +138,40 @@ if [ -z "$skip_all" ]; then local PID_DUMP="$(mktemp "$TMP/zz_pidlist.XXXXXX")" local -a PIDS_SOUGHT - if [ "$OS" == "Windows_NT" ]; then -#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. + if [ "$OS" == "Windows_NT" ]; then + # gets cygwin's (god awful) ps to show windoze processes also. + local EXTRA_DOZER_FLAGS="-W" + # pattern to use for peeling off the process numbers. + local pid_finder_pattern='s/ *\([0-9][0-9]*\) *.*$/\1/p' - # windows case has some odd gyrations to get the user list. - if [ ! -d c:/tmp ]; then - mkdir c:/tmp - fi - # windows7 magical mystery tour lets us create a file c:\\tmp_pids.txt, but then it's not - # really there in the root of drive c: when we look for it later. hoping to fix that - # problem by using a subdir, which also might be magical thinking from windows perspective. - tmppid=c:\\tmp\\pids.txt - # we have abandoned all hope of relying on ps on windows. instead we use wmic to get full - # command lines for processes. - wmic /locale:ms_409 PROCESS get processid,commandline "$tmppid" - local flag='/c' - if [ ! -z "$(uname -a | grep "^MING" )" ]; 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 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 "$pid_finder_pattern")) - done else - /bin/ps $user_flag -o pid,args >$PID_DUMP + # flags which clean up the output on unixes, which apparently cygwin + # doesn't count as. their crappy specialized ps doesn't support this. + local EXTRA_UNIX_FLAGS="-o pid,args" + # pattern to use for peeling off the process numbers. + local pid_finder_pattern='s/^[[:space:]]*\([0-9][0-9]*\).*$/\1/p' + fi + + /bin/ps $EXTRA_DOZER_FLAGS $EXTRA_UNIX_FLAGS $user_flag | tail -n +2 >$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 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 "$pid_finder_pattern")) - done + + # 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 + PIDS_SOUGHT+=($(cat $PID_DUMP \ + | grep -i "$i" \ + | 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) PIDS_SOUGHT=() @@ -233,7 +220,7 @@ if [ -z "$skip_all" ]; then # special case for windows. ps | head -1 for curr in $p; do - ps -W | grep "$curr" + ps -W -p $curr | tail -n +2 done else # normal OSes can handle a nice simple query. @@ -356,7 +343,7 @@ if [ -z "$skip_all" ]; then if [ -z "$wheres_nechung" ]; then echo "The nechung oracle program cannot be found. You may want to consider" echo "rebuilding the feisty meow applications with this command:" - echo "bash $FEISTY_MEOW_SCRIPTS/generator/bootstrap_build.sh" + echo "bash $FEISTY_MEOW_SCRIPTS/generator/produce_feisty_meow.sh" else $wheres_nechung fi @@ -366,7 +353,7 @@ if [ -z "$skip_all" ]; then function regenerate() { # do the bootstrapping process again. echo "regenerating feisty meow script environment." - bash $FEISTY_MEOW_SCRIPTS/core/bootstrap_shells.sh + bash $FEISTY_MEOW_SCRIPTS/core/reconfigure_feisty_meow.sh echo # force a full reload by turning off sentinel variable and alias. # the nethack one is used by fred's customizations. @@ -473,7 +460,7 @@ if [ -z "$skip_all" ]; then { local dir="$1"; shift pushd "$dir" &>/dev/null - rm $* &>/dev/null + rm -rf $* &>/dev/null popd &>/dev/null } @@ -564,9 +551,54 @@ return 0 ############## + # just shows a separator line for an 80 column console, or uses the first + # parameter as the number of columns to expect. + function separator() + { + count=$1; shift + if [ -z "$count" ]; then + count=79 + fi + echo + local i + for ((i=0; i < $count - 1; i++)); do + echo -n "=" + done + echo + echo + } + # alias for separator. + function sep() + { + separator $* + } + + ############## + function function_sentinel() { return 0; } if [ ! -z "$SHELL_DEBUG" ]; then echo "feisty meow function definitions done."; fi - + + ############## + + # test code for set_var_if_undefined. + run_test=0 + if [ $run_test != 0 ]; then + echo running tests on set_var_if_undefined. + flagrant=petunia + set_var_if_undefined flagrant forknordle + check_result "testing if defined variable would be whacked" + if [ $flagrant != petunia ]; then + echo set_var_if_undefined failed to leave the test variable alone + exit 1 + fi + unset bobblehead_stomper + set_var_if_undefined bobblehead_stomper endurance + if [ $bobblehead_stomper != endurance ]; then + echo set_var_if_undefined failed to set a variable that was not defined yet + exit 1 + fi + fi + fi