web-dev-qa-db-fra.com

Laisser Nautilus ouvrir le script en tant que fenêtre de terminal

Sur Mac OS X, lorsque vous double-cliquez sur un fichier .sh, une fenêtre de terminal s'ouvre pour exécuter le script et me permettre d'interagir avec lui.

Sur Ubuntu, en double-cliquant sur un script, je vois immédiatement ses effets: le script est exécuté. Seulement, quand je le lance de cette façon, aucune fenêtre en ligne de commande ne s'ouvre. Bien sûr, je peux simplement exécuter le script à partir de Terminal, mais il serait bien d’avoir un dossier Scripts, dans lequel ils sont organisés en sous-dossiers, et de double-cliquer sur les scripts pour les démarrer en tant que fenêtres Terminal. Notez que je ne souhaite pas créer de programme de lancement (fichier .desktop]), mais j'aimerais l'appliquer globalement.

2
Manchineel

Introduction

Le script ci-dessous rassemble plusieurs idées sur le fonctionnement de gnome-terminal et bash Shell afin de créer un menu avec un clic droit permettant d'exécuter un programme sélectionné dans un terminal graphique. Bien entendu, il ne s’agit pas d’un double-clic avec la souris, mais d’une solution utilisable et rapide. Il peut être encore plus rapide en faisant un clic droit et en appuyant sur la touche S pour accéder rapidement au sous-menu "Scripts". De plus, cela peut fonctionner avec plusieurs fichiers sélectionnés et ouvrira une fenêtre de terminal pour chacun d'entre eux.

Démo

Supposons que nous ayons un script de test (qui affiche simplement "Hello World" et les exits) dans un répertoire ouvert avec Nautilus. Supposons que ce script dispose déjà d'autorisations exécutables. Faites un clic droit sur le fichier, sélectionnez Scripts -> run_with_terminal.py

enter image description here

La fenêtre du terminal apparaîtra et donnera la sortie appropriée, et attendez que l'utilisateur appuie sur Entrée pour sortir.

Source du script

Aussi disponible sur GitHub

#!/usr/bin/env python
from os import path
from sys import argv
from subprocess import call

for item in argv[1:]:
    full_path = path.abspath('./' + item)
    call(['gnome-terminal','-e', 
          "bash -c '" +  full_path + ";read'"])

Version privilégiée

#!/usr/bin/env python
from os import path
from sys import argv
from subprocess import call

for item in argv[1:]:
    full_path = path.abspath('./' + item)
    call(['gnome-terminal','-e', 
          "pkexec bash -c '" +  full_path + ";read'"])

Principe d'opération

Gnome Terminal (qui est le terminal par défaut sur Ubuntu) permet d’exécuter une commande avec le drapeau -e, mais le problème est qu’il attend que la commande se termine. Si vous avez un script ou un fichier exécutable qui n'imprime que quelque chose à l'écran et se ferme immédiatement, vous ne verrez que la fenêtre du terminal clignoter et disparaître.

Essentiellement, il ne permet d'exécuter qu'une seule commande. Par contre, si nous utilisons bash -c 'command1;command2;command3', cela sera traité par gnome-terminal comme une seule commande, mais nous permettrait en fait d’exécuter plusieurs processus en tant qu’enfants du shell bash. Ce n'est pas nouveau et a été montré longtemps avant .

Enfin, pour empêcher la sortie immédiate de la fenêtre, nous utilisons la commande read qui lit simplement stdin. L’utilisation de base pour cela est de permettre à l’utilisateur de fermer la fenêtre en appuyant sur la touche Entrée (sorte d’astuce adaptée à l’utilisation de getch() de la programmation en C dans un IDE)

Le gestionnaire de fichiers (aussi appelé Nautilus) permet d’utiliser des scripts personnalisés (placés dans `~/.local/nautilus/scripts) qui fonctionnent sur le fichier/dossier sélectionné. Ils sont accessibles en cliquant avec le bouton droit sur le fichier et en sélectionnant l'entrée appropriée dans le sous-menu Scripts.

Ainsi, en rassemblant toutes ces connaissances, nous obtenons le script de travail que vous voyez ci-dessus. Python n'était qu'un langage de choix pour moi, mais cette même idée aurait pu être mise en œuvre dans les scripts Perl, Ruby, Shell, etc.

3