Here is main script . I run it and get some errors like this :

╭─frankwang@ubuntu ~/ion-open-source  
╰─➤ ./ionadmin                                                                                                               

: 1 1 ""
[?] admin pgm can't open SDR config file '""': No such file or directory
at line 157 of ici/utils/ionadmin.c, ionadmin can't get SDR parms.
: q   
at line 427 of ici/library/platform_sm.c, Can't get shared memory segment: Invalid argument (0)
at line 312 of ici/library/memmgr.c, Can't open memory region.
at line 342 of ici/sdr/sdrxn.c, Can't open SDR working memory.
at line 483 of ici/sdr/sdrxn.c, Can't open SDR working memory.
at line 913 of ici/library/ion.c, Can't initialize the SDR system.
Stopping ionadmin.

The script:

#! /bin/bash
# ionadmin - temporary wrapper script for .libs/ionadmin
# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1
# The ionadmin program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh

# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

relink_command="(cd /home/frankwang/ion-open-source; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; export PATH; gcc -I./ici/library -I./bp/library -I./ltp/library -I./ici/test -I./ici/sdr -Dlinux -DSPACE_ORDER=3 -fno-strict-aliasing -DENABLE_BPACS -DENABLE_IMC -DENABLE_MANPAGES -Wall -Werror -g -include config.h -I./ici/include -I./ltp/include -I./dgr/include -I./bp/include -I./bss/include -I./dtpc/include -I./bssp/include -I./ams/include -I./cfdp/include -g -O2 -DNOEXPAT -o \$progdir/\$file ici/utils/ionadmin-ionadmin.o  -lpthread ./.libs/libici.so -Wl,-rpath -Wl,/home/frankwang/ion-open-source/.libs)"

# This environment variable determines our operation mode.
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
  # install mode needs the following variables:
  notinst_deplibs=' libici.la'
  # When we are sourced in execute mode, $file and $ECHO are already set.
  if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
  eval 'cat <<_LTECHO_EOF
    ECHO="printf %s\\n"

# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
# /script/ and the wrapper /executable/ which is used only on
# windows platforms, and (c) all begin with the string --lt-
# (application programs are unlikely to have options which match
# this pattern).
# There are only two supported options: --lt-debug and
# --lt-dump-script. There is, deliberately, no --lt-help.
# The first argument to this parsing function should be the
# script's ./libtool value, followed by no.
func_parse_lt_options ()
  for lt_opt
    case "$lt_opt" in
    --lt-debug) lt_option_debug=1 ;;
        lt_dump_D=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
        test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
        lt_dump_F=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%^.*/%%'`
        cat "$lt_dump_D/$lt_dump_F"
        exit 0
        $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
        exit 1

  # Print the debug banner immediately:
  if test -n "$lt_option_debug"; then
    echo "ionadmin:ionadmin:${LINENO}: libtool wrapper (GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1" 1>&2

# Used when --lt-debug. Prints its arguments to stdout
# (redirection is the responsibility of the caller)
func_lt_dump_args ()
  for lt_arg
    $ECHO "ionadmin:ionadmin:${LINENO}: newargv[$lt_dump_args_N]: $lt_arg"
    lt_dump_args_N=`expr $lt_dump_args_N + 1`

# Core function for launching the target application
func_exec_program_core ()

      if test -n "$lt_option_debug"; then
        $ECHO "ionadmin:ionadmin:${LINENO}: newargv[0]: $progdir/$program" 1>&2
        func_lt_dump_args ${1+"$@"} 1>&2
      exec "$progdir/$program" ${1+"$@"}

      $ECHO "$0: cannot exec $program $*" 1>&2
      exit 1

# A function to encapsulate launching the target application
# Strips options in the --lt-* namespace from $@ and
# launches target application with the remaining arguments.
func_exec_program ()
  case " $* " in
  *\ --lt-*)
    for lt_wr_arg
      case $lt_wr_arg in
      --lt-*) ;;
      *) set x "$@" "$lt_wr_arg"; shift;;
    done ;;
  func_exec_program_core ${1+"$@"}

  # Parse options
  func_parse_lt_options "$0" ${1+"$@"}

  # Find the directory that this script lives in.
  thisdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
  test "x$thisdir" = "x$file" && thisdir=.

  # Follow symbolic links until we get to the real thisdir.
  file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'`
  while test -n "$file"; do
    destdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`

    # If there was a directory component, then change thisdir.
    if test "x$destdir" != "x$file"; then
      case "$destdir" in
      [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
      *) thisdir="$thisdir/$destdir" ;;

    file=`$ECHO "$file" | /bin/sed 's%^.*/%%'`
    file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'`

  # Usually 'no', except on cygwin/mingw when embedded into
  # the cwrapper.
  if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
    # special case for '.'
    if test "$thisdir" = "."; then
    # remove .libs from thisdir
    case "$thisdir" in
    *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /bin/sed 's%[\\/][^\\/]*$%%'` ;;
    .libs )   thisdir=. ;;

  # Try to get the absolute directory name.
  absdir=`cd "$thisdir" && pwd`
  test -n "$absdir" && thisdir="$absdir"


  if test ! -f "$progdir/$program" ||
     { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \
       test "X$file" != "X$progdir/$program"; }; then


    if test ! -d "$progdir"; then
      mkdir "$progdir"
      rm -f "$progdir/$file"

    # relink executable if necessary
    if test -n "$relink_command"; then
      if relink_command_output=`eval $relink_command 2>&1`; then :
    printf %s\n "$relink_command_output" >&2
    rm -f "$progdir/$file"
    exit 1

    mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
    { rm -f "$progdir/$program";
      mv -f "$progdir/$file" "$progdir/$program"; }
    rm -f "$progdir/$file"

  if test -f "$progdir/$program"; then
    if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
      # Run the actual program with our arguments.
      func_exec_program ${1+"$@"}
    # The program doesn't exist.
    $ECHO "$0: error: \`$progdir/$program' does not exist" 1>&2
    $ECHO "This script is just a wrapper for $program." 1>&2
    $ECHO "See the libtool documentation for more information." 1>&2
    exit 1

I tried to debug it with bash itself and the bashdb , but failed . What should I do to find the way to fix this bug ? Click this for information of ION-open-source .

---------------------second edit--------------------------------

The problem is the value of some vars that should be passed into this scripts is NULL . In what condition can it cause this error ? It will be very grateful if you post your suggestion .

closed as unclear what you're asking by dr01, Archemar, Mikel, chaos, vonbrand Oct 29 '15 at 19:29

Please clarify your specific problem or add additional details to highlight exactly what you need. As it's currently written, it’s hard to tell exactly what you're asking. See the How to Ask page for help clarifying this question. If this question can be reworded to fit the rules in the help center, please edit the question.

  • 2
    error come from run time binary not from bash. – Archemar Oct 29 '15 at 14:02
  • It looks like you typed "" at the ionadmin prompt, and that's not a valid command file. – Mikel Oct 29 '15 at 14:45
  • What probably happened is his script is calling it with an variable that did not get resolved properly something like prog "$arg" where the variable arg is empty hence the error. I showed him how to add trace to his script lets see if he figures it out. – Rob Oct 29 '15 at 14:54
  • @Archemar yes , and for some reason error happened in function calls . And what I wanna know is how to trace these function calling in this script&C program condition . – Frank Wang Oct 30 '15 at 1:20
  • @Mikel "" means default here . – Frank Wang Oct 30 '15 at 1:21

When you want to debug a script you can add "set -x" to turn on debuging.. that will display every command prior to executing it. and you can do "set +x" to stop

you can also use this syntax to apply debugging/trace for a specific script function name(s).

 typeset -tf nameOfAscriptFunction,andotherfunction

When doing so I also suggest setting your PS4 (debug prompt) using something like

 export PS4='[$0: $LINENO]-> '

For example this test.sh script where I added a set -x and set +x in it:

 echo "will not display trace for this line"
 set -x
 var="tracing is turned on"
 echo "See how \$var is replaced with its value in this trace: $var"
 set +x
 echo "This line will not have any trace"

with the default PS4 the output looks like:

 will not display trace for this line
 ++ var='tracing is turned on'
 ++ echo 'See how $var is replaced with its value in this trace: tracing is turned on'
 See how $var is replaced with its value in this trace: tracing is turned on
 ++ set +x
 This line will not have any trace

with the PS4 set using export PS4='[$0: $LINENO]-> ' the ouput of the same script now looks like this:

 will not display trace for this line
 [[./test.sh: 3]-> var='tracing is turned on'
 [[./test.sh: 4]-> echo 'See how $var is replaced with its value in this trace: tracing is turned on'
 See how $var is replaced with its value in this trace: tracing is turned on
 [[./test.sh: 5]-> set +x
 This line will not have any trace

Instead of the ++ you get the script file and line number before the trace. This can be very helpful especially with very long scripts.

Using this sort of trace you should be able to see what your script generated as a command and see if it is missing something or resolved an argument wrong.

  • THX , I tried to use "trap"&"debug block" , and I had found out where it exit but failed to know how to fix . There are something confusing I found when trying to fix it : 1.some vars in this script like ZSH_VERSION & sh are not an environment var in local system ,and the value of them are NULL in that script . 2 .I check the manual of this open_source and have little suspicion of errors happened in MAKE . – Frank Wang Oct 30 '15 at 1:06

Not the answer you're looking for? Browse other questions tagged or ask your own question.