Por lo que puedo reunir, los .desktop
archivos son accesos directos que permiten personalizar la configuración de la aplicación. Por ejemplo, tengo muchos de ellos en mi /usr/share/applications/
carpeta.
Si abro esa carpeta nautilus
, puedo ejecutar estas aplicaciones simplemente haciendo doble clic en su archivo asociado, por ejemplo, al hacer doble clic se firefox.desktop
ejecuta Firefox. Sin embargo, no puedo encontrar una manera de hacer lo mismo a través de la terminal.
Si lo hago gnome-open foo.desktop
, simplemente se abre foo.desktop
como un archivo de texto. Si lo hago ejecutable y luego lo ejecuto en bash, simplemente falla (lo que se espera, claramente no es un script de bash).
EDITAR: Hacer exec /fullpath/foo.desktop
me da un Permission denied
mensaje, incluso si cambio de propietario. Si hago ejecutable y hago el mismo comando, la pestaña de terminal que estoy usando simplemente se cierra (supongo que se bloquea). Finalmente, si lo hago sudo exec /fullpath/foo.desktop
, recibo un informe de error sudo: exec: command not found
.
Esa es mi pregunta, ¿cómo puedo ejecutar un foo.desktop
archivo desde la terminal?
fuente
exec
falló es porque exec reemplaza el proceso que está ejecutando actualmente con el proceso que especificó, por lo que lo que hizo fue intentar reemplazar su shell con la ejecución del escritorio como un binario compilado. La razón por la que no pudosudo exec
es porque es un shell incorporado y no un comando binario.Respuestas:
El comando que se ejecuta está contenido dentro del archivo de escritorio, precedido por
Exec=
lo que puede extraer y ejecutar:Para romper eso
Podría poner esto en un archivo, digamos
~/bin/deskopen
con el contenidoLuego hazlo ejecutable
Y luego podrías hacer, por ejemplo
Los argumentos (
%u
,%F
etc.) se detallan en http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.0.html#exec-variables ; ninguno de ellos es relevante para el lanzamiento en la línea de comandos .fuente
grep '^Exec' firefox.desktop | sed 's/^Exec=//'
abre Firefox con una pestaña que carga www.% U.com .sed
para eliminar cualquier argumento. Pero creo que podría haber una forma más "natural" de ejecutarlo..desktop
archivos simples , pero ignora entradas comoPath=
yTryExec=
que pueden afectar la ejecución. También se ejecuta incorrectamenteExec=
si el archivo contiene acciones de escritorio ("La respuesta debería ser
Pero debido a un error, esto ya no funciona.
fuente
exo-open
aparece como solución alternativa y también abre gedit. :(gnome-open
no no llamarxdg-open
, es al revés! Entonces, el problema radica engvfs-open
(el sucesor ognome-open
)xdg-open
funciona por asociación mimetype, y los.desktop
archivos están asociados con editores de texto, ya que son una subclase de textoCon cualquier ubuntu reciente que admita
gtk-launch
simplemente simplemente vayagtk-launch <file>
donde está el nombre del archivo .desktop con o sin la.desktop
parteAsí se
gtk-launch foo
abrefoo.desktop
(
gtk-launch
documentación )El .desktop debe estar en / usr / share / aplicaciones, / usr / local / share / aplicaciones o ~ / .local / share / aplicaciones
Utilizable desde la terminal o alt + F2 (alt + F2 almacena el comando en el historial de manera tan accesible)
fuente
A partir de hoy (12.10) el error aún está presente. De hecho, depende de cómo funciona
gvfs-open
(llamado porxdg-open
).Aún así, logré una solución rápida (robando inspiración del código fuente nautilus). Es un poco complicado, pero funciona perfectamente en Ubuntu 12.10, agregando un ícono significativo (no más
?
) en el iniciador de Unity.Primero, escribí un script de Python usando Gio y lo guardé como
~/bin/run-desktop
:El script necesita tener el permiso ejecutable, así que ejecuté esto en una terminal:
Luego creé la
.desktop
entrada relativa en~/.local/share/applications/run-desktop.desktop
:Finalmente, asocié la entrada como el controlador predeterminado en
~/.local/share/applications/mimeapps.list
la[Default Applications]
sección como:Ahora:
xdg-open
something.desktop funciona como se esperaba#!/usr/bin/xdg-open
el hashbang en la parte superior de una entrada de escritorio ejecutable también funcionaSerá un trabajo inútil
gvfs-open
resolver el error, pero mientras tanto ...fuente
Exec=
líneas y%
parámetros en el comando correctamente./usr/bin/xdg-openpy
, y le di unchmod +x
- y lo usé enlauncher.launch([],context)
lugar de...None,context)
(debido a " TypeError: argumento 1: Debe ser secuencia, no NoneType "). Ahoraxdg-openpy app.desktop
funciona desde la línea de comandos (y todo de manera normal cuando se hace doble clicapp.desktop
), y me puede recordar si intento llamar a la terminalxdg-open
y presionar tab. ¡Salud!.desktop
archivo, por lo que es el enfoque más sensato (y seguro). También usa moderno engi.repository
lugar de obsoletopygtk
, ¡genial! :)La direccion correcta
Realmente deberías estar usando
gtk-launch
si está disponible. Por lo general, forma parte del paquete libgtk-3-bin (esto puede variar según la distribución).gtk-launch
se usa de la siguiente manera:Tenga en cuenta que
gtk-launch
requiere la instalación del archivo .desktop (es decir, ubicado en/usr/share/applications
o~/.local/share/applications
).Por lo tanto, para evitar esto, podemos usar una pequeña función de Bash que instala temporalmente el archivo .desktop deseado antes de iniciarlo. La forma "correcta" de instalar un archivo .desktop es a través de,
desktop-file-install
pero voy a ignorar eso.Puede usarlo así (y también pasar argumentos adicionales o URI si lo desea):
La alternativa manual
Si desea analizar y ejecutar manualmente un archivo .desktop , puede hacerlo con el siguiente
awk
comando:Si desea tratar el
awk
comando como un script todo en uno; incluso podemos mostrar un mensaje de error y salir con un código de retorno de 1 en caso de que no se encuentre un comando Exec :Los comandos mencionados anteriormente:
%f
. Ej .%u
,%U
). Es posible reemplazarlos con argumentos posicionales según lo previsto en la especificación, pero hacerlo agregaría una complejidad significativa al problema. Consulte la última especificación de entrada de escritorio .Tenga en cuenta que este script de AWK aborda algunos casos extremos que pueden o no ser abordados adecuadamente por algunas de las otras respuestas. Específicamente, este comando elimina múltiples variables Exec (teniendo cuidado de no eliminar el símbolo%), solo ejecutará un solo comando de línea Exec y se comportará como se esperaba incluso si el comando de línea Exec contiene uno o más signos de igual (por ejemplo
script.py --profile=name
).Solo algunas otras advertencias ... De acuerdo con la especificación, TryExec es:
Con eso en mente, no tiene sentido ejecutar su valor.
Algunas otras preocupaciones son Path y Terminal . La ruta consiste en el directorio de trabajo para ejecutar el programa. Terminal es un booleano que indica si el programa se ejecuta en una ventana de terminal. Todos estos pueden abordarse, pero no tiene sentido reinventar la rueda ya que ya hay implementaciones de la especificación. Si desea implementar Path , tenga en cuenta que
system()
genera un subproceso, por lo que no puede cambiar el directorio de trabajo haciendo algo comosystem("cd \047" working_directory "\047"); system(command)
. Sin embargo, presumiblemente podrías hacer algo asísystem("cd \047" working_directory "\047 && " command)
. Nota \ 047 son comillas simples (por lo que el comando no se rompe en las rutas con espacios).La alternativa a Python
Aquí estoy robando una página de Carlo , quien sugirió crear un script de Python para usar el módulo gi . Aquí hay una forma mínima de ejecutar el mismo código desde el shell sin tener que crear un archivo y preocuparse por las E / S.
Luego ejecute la función del iniciador de la siguiente manera:
Tenga en cuenta que el uso de URI es opcional. Además, no se realiza ninguna comprobación de errores, por lo que querrá asegurarse de que el iniciador exista y sea legible (antes de usarlo) si desea que su script sea duradero.
fuente
awk
comando es bueno. Por lo tanto, un +1awk
solución no funcionará correctamente si el comando tiene espacios en blanco o barras diagonales de escape doble. Se rompe con esto:Exec=env WINEPREFIX="/path/to/.wine" wine c:\\\\windows\\\\command\\\\start.exe /Unix /path/to/.wine/dosdevices/c:/users/Public/Рабочий\\ стол/appname.lnk
y ladex
solución funciona bien.Si bien OP no estaba preguntando sobre KDE, para cualquiera que esté ejecutando KDE se puede usar el siguiente comando:
kioclient exec <path-to-desktop-file>
En Fedora, esto está incluido en las
kde-runtime
rpm.fuente
Podrías usar dex .
fuente
.desktop
archivos escritos a mano . Y también puede crear.desktop
archivos, ¡sí! :-)parece funcionar en la versión 13.10, si está instalado exo-utils (como es el caso de Xubuntu).
fuente
Adición a la respuesta de Hamish.
Dado el script deskopen, puede usar una referencia a él como la línea shebang en un archivo .desktop , ya que el carácter de comentario todavía está
#
. Es decir, ponga esto como la primera línea del archivo .desktop :Luego marque el archivo .desktop como ejecutable (por ejemplo, con a
chmod +x whatever.desktop
), y luego puedey voilà - ¡La aplicación se abrirá! (Complete con el archivo de icono que especifiqué, aunque no tengo idea de cómo hacerlo).
Ahora, si también desea que deskopen pase por los parámetros de la línea de comandos, puede usar esta versión ligeramente modificada:
Como comentario aparte, intenté usar en
"#{@:2}"
lugar deshift
ing, pero seguía dándome una 'mala sustitución' ...fuente
"${@:1}"
lugar deshift
, pero eso requiere enbash
lugar desh
en su#!
shebang. En mi humilde opinión, su enfoque de cambio original es más simple y mejorActualmente no hay una aplicación que haga lo que usted describe en los archivos de Ubuntu. Hay un par de esfuerzos en progreso para crear una solución general para proporcionar integración para entornos de escritorio (como openbox) que no cumplen con estas especificaciones XDG.
Arch Linux está trabajando en una implementación de xdg-autostart basada en las bibliotecas python-xdg. Por lo que puedo encontrar, esto aún no parece completamente completo, pero tiene algunos informes de éxito.
También hay una implementación en C ++ de xdg-autostart en gitorious (http://gitorious.org/xdg-autostart/) que probablemente se beneficiaría de un uso más amplio.
Si alguna de las soluciones funciona para usted, considere enviar el trabajo necesario para su inclusión en Debian o Ubuntu.
Para usar cualquiera de las herramientas con openstart, debe llamarlo en /etc/xdg/openbox/autostart.sh (si estoy leyendo la documentación de openbox correctamente). Si esto no funciona, probablemente pueda llamarlo en cualquiera de los scripts de inicialización de sesión de openbox.
fuente
No tengo una solución inmediata que cumpla con el requisito de "usar un comando estándar" , pero si desea analizar mínimamente los
.desktop
archivos o desea crear un alias Bash, entonces lo siguiente debería funcionar:awk -F= '/Exec=/{system($2); exit}' foo.desktop
Otro enfoque que podría ser interesante sería crear un
binfmt-misc
método a nivel de kernel que coincida con los.desktop
archivos (consultegrep -r . /proc/sys/fs/binfmt_misc/
los patrones que ha habilitado actualmente).Al final del día, algo en algún lugar tendrá que analizar los
.desktop
archivos, es solo una cuestión de qué tan "estándar / predeterminado" es.fuente
awk
lugar de una cadena degrep
sysed
s.Exec=
líneasTomé el guión de la respuesta de Carlo anterior e intenté mejorarlo para mi propio uso en el escritorio.
Esta versión del script le permitirá ejecutar cualquier aplicación como si la hubiera ingresado en el HUD, siempre que sea el primer resultado. También le permite pasar argumentos de archivo para archivos .desktop que no admiten URI.
fuente
Al intentar probar estos archivos, encontré la forma más simple de verificar que el DM o el administrador de la sesión hicieran lo que esperaba era abrir el directorio circundante en un navegador de carpetas de la interfaz de usuario y luego hacer doble clic para abrirlos.
Si está en una línea de comando:
gvfs-open .
o lagnome-open .
abrirá en el explorador de carpetas configurado.Lo sed no reflejará el comportamiento del DM, incluidas cosas complicadas como escapes y citas donde realmente no querría un comportamiento alternativo. No es la línea de comando, pero sí validado las cosas. También encontré la configuración
Terminal=true
útil para la depuración.fuente
Esta respuesta SO es lo que me dejó claro: no intente ejecutar el archivo de escritorio, ejecute el archivo señalado en el archivo de escritorio.
Por ejemplo, ejecute /home/jsmith/Desktop/x11vnc.sh
fuente
(Compilado de las otras respuestas aquí)
Dependiendo de su sistema y los diversos errores que pueden existir o no en su sistema, intente lo siguiente hasta que uno de ellos funcione:
xdg-open program_name.desktop
exo-open program_name.desktop
gtk-launch program_name.desktop
kioclient exec program_name.desktop
dex program_name.desktop
Tenga en cuenta que en los sistemas Ubuntu, sus lanzadores de escritorio "menú de inicio" están disponibles en
/usr/share/applications/
.Como ejemplo, para mostrar cuál de los comandos anteriores funciona o no en mi sistema Ubuntu 14.04, estos son los resultados de las siguientes llamadas:
xdg-open /usr/share/applications/eclipse_for_cpp.desktop
# Falla debido a un error (intenta que guarde este archivo .desktop)exo-open /usr/share/applications/eclipse_for_cpp.desktop
# Trabajosgtk-launch /usr/share/applications/eclipse_for_cpp.desktop
# Falla con "gtk-launch: no existe tal aplicación"kioclient exec /usr/share/applications/eclipse_for_cpp.desktop
# Trabajosdex /usr/share/applications/eclipse_for_cpp.desktop
# Falla, ysudo apt install dex
no puede localizar el paquete dexfuente
Asegúrese de que el script al que apunta su archivo de escritorio también sea ejecutable.
Si aún no funciona. Haga que el archivo de escritorio pueda ejecutarse en la terminal cambiando
Terminal=true
y colóquelo dentro de un script bash. Ejecute el script para atrapar la salida del error. Cambiar de nuevo cuando se corrijan los errores.fuente
La respuesta de Hamish es excelente, pero me gustaría sugerir una alternativa más simple, con menos tuberías involucradas:
$(awk -F= '/^Exec/||/^TryExec/ {print $2;exit}' /usr/share/applications/firefox.desktop)
En este caso,
awk
busca una línea que comience porExec
, y luego simplemente imprimimos los campos después de esa línea, usando for loop e=
imprimimos el campo 2, es decir, lo que venga después de ese campo. Los corchetes en los extremos de los comandos$(...)
son sustitución de parámetros, por lo tanto, shell ejecutará lo que devuelva el comando awk; en este caso, devuelve el comando real que viene despuésExec=
.En algunos casos raros, puede haber más de un
=
signo, que todavía es una posibilidad. Por eso, sugierofuente
awk
and Serg =)TryExec
, tal vez deberías verificar tu segundo comando =)awk
es mi arma preferida cuando se trata de procesamiento de texto. Además, su sintaxis está cercaC
. Ah, y ya agregóTryExec
parte ^ _ ^%f
,%u
,%U
o algo así detrás del comando?