Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Failed to execute process:startx #1281

Closed
vgbsd opened this issue Feb 3, 2014 · 5 comments

Comments

Projects
None yet
4 participants
@vgbsd
Copy link

commented Feb 3, 2014

FreeBSD 10
fish, version 2.1.0

Failed to execute process '/usr/local/bin/startx'. Reason:
exec: Exec format error
The file '/usr/local/bin/startx' is marked as an executable but could not be run by the operating system.
@zanchey

This comment has been minimized.

Copy link
Member

commented Feb 4, 2014

Could you tell us the output of file /usr/local/bin/startx and of uname -a? Thanks!

@vgbsd

This comment has been minimized.

Copy link
Author

commented Feb 4, 2014

usr/local/bin/startx


#!/bin/sh

#
# This is just a sample implementation of a slightly less primitive
# interface than xinit.  It looks for user .xinitrc and .xserverrc
# files, then system xinitrc and xserverrc files, else lets xinit choose
# its default.  The system xinitrc should probably do things like check
# for .Xresources files and merge them in, start up a window manager,
# and pop a clock and several xterms.
#
# Site administrators are STRONGLY urged to write nicer versions.
#

unset DBUS_SESSION_BUS_ADDRESS
unset SESSION_MANAGER




userclientrc=$HOME/.xinitrc
sysclientrc=/usr/local/etc/X11/xinit/xinitrc


userserverrc=$HOME/.xserverrc
sysserverrc=/usr/local/etc/X11/xinit/xserverrc
defaultclient=xterm
defaultserver=/usr/local/bin/X
defaultclientargs=""
defaultserverargs=""
defaultdisplay=":0"
clientargs=""
serverargs=""


enable_xauth=1


# Automatically determine an unused $DISPLAY
d=0
while true ; do
    [ -e /tmp/.X$d-lock ] || break
    d=$(($d + 1))
done
defaultdisplay=":$d"
unset d



whoseargs="client"
while [ x"$1" != x ]; do
    case "$1" in
    # '' required to prevent cpp from treating "/*" as a C comment.
    /''*|\./''*)
    if [ "$whoseargs" = "client" ]; then
        if [ x"$client" = x ] && [ x"$clientargs" = x ]; then
        client="$1"
        else
        clientargs="$clientargs $1"
        fi
    else
        if [ x"$server" = x ] && [ x"$serverargs" = x ]; then
        server="$1"
        else
        serverargs="$serverargs $1"
        fi
    fi
    ;;
    --)
    whoseargs="server"
    ;;
    *)
    if [ "$whoseargs" = "client" ]; then
        clientargs="$clientargs $1"
    else
        # display must be the FIRST server argument
        if [ x"$serverargs" = x ] && \
         expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then
        display="$1"
        else
        serverargs="$serverargs $1"
        fi
    fi
    ;;
    esac
    shift
done

# process client arguments
if [ x"$client" = x ]; then
    client=$defaultclient

    # For compatibility reasons, only use startxrc if there were no client command line arguments
    if [ x"$clientargs" = x ]; then
        if [ -f "$userclientrc" ]; then
            client=$userclientrc
        elif [ -f "$sysclientrc" ]; then
            client=$sysclientrc






        fi
    fi
fi

# if no client arguments, use defaults
if [ x"$clientargs" = x ]; then
    clientargs=$defaultclientargs
fi

# process server arguments
if [ x"$server" = x ]; then
    server=$defaultserver

    # For compatibility reasons, only use xserverrc if there were no server command line arguments
    if [ x"$serverargs" = x -a x"$display" = x ]; then
    if [ -f "$userserverrc" ]; then
        server=$userserverrc
    elif [ -f "$sysserverrc" ]; then
        server=$sysserverrc
    fi
    fi
fi

# if no server arguments, use defaults
if [ x"$serverargs" = x ]; then
    serverargs=$defaultserverargs
fi

# if no display, use default
if [ x"$display" = x ]; then
    display=$defaultdisplay
fi

if [ x"$enable_xauth" = x1 ] ; then
    if [ x"$XAUTHORITY" = x ]; then
        XAUTHORITY=$HOME/.Xauthority
        export XAUTHORITY
    fi

    removelist=

    # set up default Xauth info for this machine
    case `uname` in
    Linux*)
        if [ -z "`hostname --version 2>&1 | grep GNU`" ]; then
            hostname=`hostname -f`
        else
            hostname=`hostname`
        fi
        ;;
    *)
        hostname=`hostname`
        ;;
    esac

    authdisplay=${display:-:0}

    mcookie=`/usr/bin/openssl rand -hex 16`







    if test x"$mcookie" = x; then
        echo "Couldn't create cookie"
        exit 1
    fi
    dummy=0

    # create a file with auth information for the server. ':0' is a dummy.
    xserverauthfile=$HOME/.serverauth.$$
    trap "rm -f '$xserverauthfile'" HUP INT QUIT ILL TRAP KILL BUS TERM
    xauth -q -f "$xserverauthfile" << EOF
add :$dummy . $mcookie
EOF




    serverargs=${serverargs}" -auth "${xserverauthfile}


    # now add the same credentials to the client authority file
    # if '$displayname' already exists do not overwrite it as another
    # server man need it. Add them to the '$xserverauthfile' instead.
    for displayname in $authdisplay $hostname$authdisplay; do
        authcookie=`xauth list "$displayname" \
        | sed -n "s/.*$displayname[[:space:]*].*[[:space:]*]//p"` 2>/dev/null;
        if [ "z${authcookie}" = "z" ] ; then
            xauth -q << EOF 
add $displayname . $mcookie
EOF
        removelist="$displayname $removelist"
        else
            dummy=$(($dummy+1));
            xauth -q -f "$xserverauthfile" << EOF
add :$dummy . $authcookie
EOF
        fi
    done
fi












xinit "$client" $clientargs -- "$server" $display $serverargs



retval=$?

if [ x"$enable_xauth" = x1 ] ; then
    if [ x"$removelist" != x ]; then
        xauth remove $removelist
    fi
    if [ x"$xserverauthfile" != x ]; then
        rm -f "$xserverauthfile"
    fi
fi



















exit $retval


uname -a

FreeBSD vgBSD 10.0-RELEASE FreeBSD 10.0-RELEASE #0 r260789: Thu Jan 16 22:34:59 UTC 2014 root@snap.freebsd.org:/usr/obj/usr/src/sys/GENERIC amd64

@zanchey

This comment has been minimized.

Copy link
Member

commented Feb 4, 2014

What about running the command file /usr/local/bin/startx?

Your paste makes me wonder if the first line of your startx script is an empty line instead of #!/bin/sh.

@vgbsd

This comment has been minimized.

Copy link
Author

commented Feb 4, 2014

You are right! Two blank lines before #!/bin/sh. Respectively
file /usr/local/bin/startx /usr/local/bin/startx: ASCII text

I deleted - now
/usr/local/bin/startx: POSIX shell script, ASCII text executable

Ok!

It is strange that with tcsh it was launched with blank lines.

Many thanks and with the best regards!

@krader1961

This comment has been minimized.

Copy link
Contributor

commented Dec 8, 2016

Someone was asking about this on IRC/Gitter recently because they were seeing the same error. Albeit with different scripts created at their company that did not contain a shebang line. They noticed that those scripts ran just fine when launched from sh/bash and therefore didn't understand why fish reported an error.

The answer is that the Bourne shells and those derived from it like Bash and Zsh contain a compatibility shim that is no longer necessary. There is a common misconception that the shebang line is read by the shell. That isn't true: it's read by the kernel. Specifically, whatever part of the kernel implements the execve() call. Long, long, ago (like 35+ years) shebang lines were new and there was no guarantee your kernel would read them to figure out which shell to run to interpret the script. So if the execve("/path/to/script") call failed your shell (/bin/sh and /bin/csh back then was pretty much the only options) would just assume the script was a Bourne shell script and directly call execve("/bin/sh", "/path/to/script").

There is a kernel of truth to the notion that the shebang line is read by the shell. Long ago the Bourne shell would look to see if the file began with : or # characters which was interpreted as meaning the file contained a Bourne shell script. That behavior was made obsolete and ultimately removed after the introduction of shebang lines.

Bottom line is that today you should not rely on that compatibility shim. Every script must have a shebang line. Full stop. Anyone telling you it's okay to omit the shebang line is propagating a dangerous practice.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.