2 votos

Intentando instalar un .sh que automatice la instalación de .pkg

Como título, estoy intentando instalar un archivo .sh pero no consigo que funcione. Cuando ejecuto sh o bash autopkginstall.sh

Me aparece el siguiente error;

/usr/local/bin/autopkginstall.sh: line 18: zmodload: command not found
/usr/local/bin/autopkginstall.sh: line 20: strftime: command not found
/usr/local/bin/autopkginstall.sh: autopkginstall.sh: line 119: syntax error: unexpected end of file

A continuación se muestra el .sh que estoy tratando de instalar.

#!/bin/zsh
# Purpose: automatically install any pkg file put into a certain folder
#
# From: Tj Luo.ma
# Mail: luomat at gmail dot com
# Web:  http://RhymesWithDiploma.com
# Date: 2013-12-11

    # variable to refer to script name without path
NAME="$0:t:r"

    # directory to check for pkg or mpkg files
DIR="$HOME/Action/AutoInstallPKG"

    # where do you want files to be moved after they are installed
SUCCESS_MOVE_TO="$HOME/.Trash/"

zmodload zsh/datetime

TIME=$(strftime "%Y-%m-%d--%H.%M.%S" "$EPOCHSECONDS")

    # where do you want files to be moved if they FAIL to be installed
ERROR_MOVE_TO="$HOME/Desktop/"

    # log our output here
LOG="$HOME/Library/Logs/AutoInstallPKG.$TIME.log"

    # quick function to
log () {

    echo "$NAME: $@" | tee -a "$LOG"

    if (( $+commands[terminal-notifier] ))
    then

        # if terminal-notifier exists, use it

        terminal-notifier -group "$NAME" \
                -sender com.apple.installer \
                -subtitle "Click to show folder $DIR:t" \
                -title "$NAME via launchd" \
                -message "$@"
    fi
}

die () { log "FATAL ERROR: $@" ; exit 1 }

if [ ! -d "$DIR" ]
then
        die "DIR is not a directory: $DIR"
fi

[[ ! -d "$SUCCESS_MOVE_TO" ]] && mkdir -p "$SUCCESS_MOVE_TO"

[[ ! -d "$ERROR_MOVE_TO" ]] && mkdir -p "$ERROR_MOVE_TO"

cd "$DIR" || die "Failed to chdir to $DIR"

    # remove .DS_Store file if it exists, so it won't keep launching `launchd`
rm -f .DS_Store

command ls -1 | while read line
do

    EXT="$line:e"

    case "$EXT" in
        pkg|mpkg)
                    log "Installing $line"
                    sudo installer -verboseR -pkg "$line" -target / -lang en 2>&1 | tee -a "$LOG"

                    EXIT="$?"

                    if [ "$EXIT" = "0" ]
                    then
                            log "$line installed!"

                            command mv -n "$line" "$SUCCESS_MOVE_TO" ||\
                            command mv -n "$line" "$ERROR_MOVE_TO"

                    else
                            log "Failed to install $line"
                            command mv -n "$line" "$ERROR_MOVE_TO"
                    fi
        ;;

        *)
                    log "$line is not a pkg or mpkg file"
                    command mv -n "$line" "$ERROR_MOVE_TO"
        ;;
    esac
done

REBOOT=no

fgrep -q 'installer: The install recommends restarting now.' "$LOG" && REBOOT=should

fgrep -q 'installer: The install requires restarting now.'   "$LOG" && REBOOT=must

case "$REBOOT" in
    must)
            log "You MUST reboot to complete installation!"
    ;;

    should)
            log "You should reboot to complete installation!"
    ;;

    no)
            log "No reboot required"
    ;;

esac

exit
#
#EOF

Estoy tratando de seguir TJLuoma's autopkginstall proyecto.

4voto

siva Puntos 23

El tinglado del expediente #!/bin/zsh (primera línea del archivo) significa que el archivo debe ejecutarse con el shell zsh. Bash y sh tienen sintaxis diferentes a zsh - debes usar el shell zsh para ejecutar este archivo.

El shebang se utiliza para que el propio archivo pueda especificar el shell que debe ejecutar el archivo. Al especificar /usr/bin/env /path/to/file.sh en el plist del agente de lanzamiento obligas a ejecutar el fichero con el shell determinado por la variable SHELL que normalmente es bash en MacOS. En su lugar, basta con proporcionar la ruta del archivo, /path/to/file.sh y el shebang hará que zsh se utilice automáticamente.

3 votos

En realidad, yo sugeriría ejecutar el script simplemente introduciendo su ruta (/ usr/local/bin/autopkginstall.sh ), Que utiliza el shebang controlar qué intérprete se utiliza, que es como debe ser.

0 votos

@Gordon Efectivamente, es una buena nota

0 votos

@klanomath Ah ya veo pero me refiero puramente a como dice OP que corren bash o sh. Eso tiene sentido, gracias por la aclaración. Yo iba puramente fuera del contenido de la respuesta - si esto era con respecto al agente de lanzamiento que es lo que debería haber sido especificado en la pregunta

0voto

Mar10Josh Puntos 1
#!/bin/zsh

La siguiente línea debe ejecutarse en zsh, no en bash. para que se ejecute en bash tiene que ser #!/bin/bash . ¿Cómo se ejecuta en zsh? Si ha ejecutado bash puede cambiarlo ejecutando zsh en el terminal bash.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X