#!/usr/bin/env bash # open_doc_onlyoffice — abre un documento ofimático con OnlyOffice Desktop Editors. # # Uso: # open_doc_onlyoffice [--restart] # # Lanza el editor desacoplado del shell (setsid + background) para que sobreviva # al proceso que lo invoca. Localiza el binario por PATH, sin hardcodear rutas. # # --restart cierra toda la instancia de OnlyOffice antes de relanzar, para forzar # la recarga desde disco de un archivo que se regeneró (OnlyOffice mantiene en # memoria la versión vieja de los documentos ya abiertos). set -euo pipefail usage() { echo "uso: open_doc_onlyoffice [--restart]" >&2 exit 2 } [ $# -ge 1 ] || usage doc="" restart=0 for arg in "$@"; do case "$arg" in --restart) restart=1 ;; -h|--help) usage ;; *) doc="$arg" ;; esac done [ -n "$doc" ] || usage if [ ! -f "$doc" ]; then echo "error: archivo no encontrado: $doc" >&2 exit 1 fi bin="$(command -v onlyoffice-desktopeditors || true)" if [ -z "$bin" ]; then echo "error: onlyoffice-desktopeditors no esta en PATH" >&2 exit 1 fi # Ruta absoluta para que OnlyOffice no dependa del directorio de trabajo. doc_abs="$(readlink -f "$doc")" if [ "$restart" -eq 1 ]; then # Cierra la app entera para descartar la copia en memoria de los documentos. # pkill -x sobre el comm exacto del proceso real (no -f, para no auto-matar # el propio script si su ruta contiene el patrón). pkill -x DesktopEditors 2>/dev/null || true # Espera (máx ~5s) a que el proceso principal termine antes de relanzar. for _ in $(seq 1 25); do pgrep -x DesktopEditors >/dev/null 2>&1 || break sleep 0.2 done fi setsid "$bin" "$doc_abs" >/dev/null 2>&1 & echo "abierto en OnlyOffice: $doc_abs"