Skip to content

Instantly share code, notes, and snippets.

@hirose31
Last active April 21, 2020 02:43
Show Gist options
  • Save hirose31/6232206 to your computer and use it in GitHub Desktop.
Save hirose31/6232206 to your computer and use it in GitHub Desktop.
シェルスクリプトでハマった件→【募】ステキな回避方法 http://d.hatena.ne.jp/hirose31/20130814/1376487935

OK

こんな感じに、

  • trivial warning が出力されない
  • 全部 ok

になればOKです。

$ ./test.sh source_me-ok1.sh
PID=22954
source=source_me-ok1.sh
--
PID=22956
critical error
ok 1 - ORENO_HOME
ok 2 - PATH
ok 3 - LOADED_ORENO

NG

trivial warning が出力されてるのでダメ。

/test.sh source_me.sh
PID=23102
source=source_me.sh
--
PID=23104
trivial warning
critical error
ok 1 - ORENO_HOME
ok 2 - PATH
ok 3 - LOADED_ORENO

not okがあるのでダメ。

$ ./test.sh source_me-ng1.sh
PID=23195
source=source_me-ng1.sh
--
PID=23197
critical error
not ok 1 - ORENO_HOME
not ok 2 - PATH
not ok 3 - LOADED_ORENO
$ ./test.sh source_me-ng2.sh
PID=23272
source=source_me-ng2.sh
--
PID=23274
critical error
not ok 1 - ORENO_HOME
not ok 2 - PATH
ok 3 - LOADED_ORENO
# -*- mode: sh; -*-
# このファイルはいじれないこととします
ORENO_HOME="/oreno"; export ORENO_HOME
PATH=$PATH:$ORENO_HOME/bin
# 無視してもいい警告
echo "trivial warning" >&2
# やばいエラー!
echo "critical error" >&2
echo_pid o 2>/dev/null
# -*- mode: sh; -*-
echo_pid() { echo "$@ $$ $BASHPID $BASH_SUBSHELL"; }
echo_pid 1
case $PATH in
*/oreno/bin*)
: # do nothing
;;
*)
echo_pid 2
. orenorc
echo_pid 3
LOADED_ORENO=1; export LOADED_ORENO
;;
esac 2>&1 | grep -v trivial
echo_pid 4
# -*- mode: sh; -*-
echo_pid() { echo "$@ $$ $BASHPID $BASH_SUBSHELL"; }
echo_pid 1
case $PATH in
*/oreno/bin*)
: # do nothing
;;
*)
echo_pid 2
. orenorc 2>&1 | grep -v trivial
echo_pid 3
LOADED_ORENO=1; export LOADED_ORENO
;;
esac
echo_pid 4
# -*- mode: sh; -*-
tmpf=$(mktemp)
exec 3>&2 2>$tmpf
case $PATH in
*/oreno/bin*)
: # do nothing
;;
*)
. orenorc
LOADED_ORENO=1; export LOADED_ORENO
;;
esac
exec 2>&3 3>&-
cat $tmpf | grep -v trivial
rm -f $tmpf
echo FINISH
echo DONE >&2
# -*- mode: sh; -*-
fifo=$(mktemp -u)
mkfifo $fifo
grep -v trivial <$fifo &
exec 3>&2 2>$fifo
rm -f $fifo
case $PATH in
*/oreno/bin*)
: # do nothing
;;
*)
. orenorc
LOADED_ORENO=1; export LOADED_ORENO
;;
esac
exec 2>&3 3>&-
echo FINISH
echo DONE >&2
# -*- mode: sh; -*-
case $PATH in
*/oreno/bin*)
: # do nothing
;;
*)
. orenorc 2> >(grep -v trivial >&2)
LOADED_ORENO=1; export LOADED_ORENO
;;
esac
echo FINISH
echo DONE >&2
# -*- mode: sh; -*-
exec 2> >(grep -v trivial >&2)
case $PATH in
*/oreno/bin*)
: # do nothing
;;
*)
. orenorc
LOADED_ORENO=1; export LOADED_ORENO
;;
esac
echo FINISH
echo DONE >&2
# -*- mode: sh; -*-
case $PATH in
*/oreno/bin*)
: # do nothing
;;
*)
. orenorc
LOADED_ORENO=1; export LOADED_ORENO
;;
esac
echo FINISH
echo DONE >&2
#!/bin/sh
source_me=${1:-source_me.sh}
echo "PID=$$"
echo "source=$source_me"
echo "-- "
{
cat <<'EOT'
echo "PID=$$"
PATH=/bin:/usr/bin
EOT
echo ". $source_me"
cat <<'EOF'
[ "$ORENO_HOME" != "/oreno" ] && echo -n "not "
echo "ok 1 - ORENO_HOME"
case $PATH in
*/oreno/bin*):;;
*)echo -n "not ";;
esac
echo "ok 2 - PATH"
[ "$LOADED_ORENO" != "1" ] && echo -n "not "
echo "ok 3 - LOADED_ORENO"
EOF
} | bash
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment