2 votes

Comment puis-je obtenir le texte du défilement du Terminal de manière programmée ?

J'ai trouvé ce commentaire qui indiquait qu'il était possible d'accéder au texte dans le défilement de la terminal macOS :

Trouver du texte dans le défilement est une faiblesse de la plupart des émulateurs de terminal ; les seuls que je connais qui le permettent sont le Terminal macOS et Terminator.

J'ai fait quelques recherches, mais je n'ai eu aucune chance de trouver quoi que ce soit en ligne disant comment cela peut être fait.

La raison pour laquelle je pose la question est que je cherche des solutions possibles à cette question Stack Overflow, et je suis en train d'enquêter s'il existe un moyen d'obtenir du texte à partir de la commande récemment exécutée dans le Terminal macOS.

Pour ce cas d'utilisation spécifique, j'espère trouver la ou les lignes qui correspondent à un motif particulier, pour pouvoir extraire le texte correspondant et le passer à la commande open.

Il y avait des tests en échec. Voir le rapport à : file:///chemin/vers/projet-parent/projet-enfant-1/build/reports/tests/test/index.html

open file:///chemin/vers/projet-parent/projet-enfant-1/build/reports/tests/test/index.html

En bref, comment puis-je obtenir le texte du défilement du Terminal ? Des points bonus s'il est limité juste à la sortie de la dernière commande, mais je peux trouver une solution fonctionnelle à mon problème si je peux obtenir tout le texte de défilement du Terminal.

1 votes

Voulez-vous rechercher (comme dans un éditeur de texte) ou extraire?

0 votes

Je souhaite spécifiquement obtenir le texte d'une ligne qui correspond à un motif particulier. Je vais ajouter cela à ma question.

0 votes

Faisant remarquer qu'en réalité, vous résolvez le mauvais problème. Cette application devrait enregistrer ses résultats de "test" dans un fichier, et non les afficher à l'écran pour qu'ils disparaissent. L'application ne sort-elle vraiment que ses résultats à l'écran ?

2voto

user3439894 Points 52496

En supposant qu'il n'y a qu'une seule instance de l'file:///.../index.html URL dans le contenu de tout le tampon de défilement de l'onglet, alors le exemple suivant du code AppleScript peut le faire:

tell application "Terminal" to ¬
    set tabHistory to ¬
        history of tab of ¬
        front window as text

set fileURL to ¬
    do shell script ¬
        "grep -o 'file:///.*\\.html' <<< " & ¬
        tabHistory's quoted form & "; exit 0"

if fileURL is not "" then ¬
    do shell script ¬
        "open " & fileURL's quoted form

Notes:

Le exemple code AppleScript ci-dessus agit sur l'onglet sélectionné de la première fenêtre dans Terminal.

S'il y a un file:///.../index.html URL dans le contenu de tout le tampon de défilement, il sera ouvert par la commande open.

S'il y a plus d'une instance de l'file:///.../index.html URL dans le contenu de tout le tampon de défilement de l'onglet, alors apportez la modification suivante dans l'exemple du code AppleScript ci-dessus pour ouvrir la dernière instance de l'file:///.../index.html URL:

Changer:

set fileURL to ¬
    do shell script ¬
        "grep -o 'file:///.*\\.html' <<< " & ¬
        tabHistory's quoted form & "; exit 0"

À:

set fileURL to ¬
    last paragraph of ¬
    (do shell script ¬
        "grep -o 'file:///.*\\.html' <<< " & ¬
        tabHistory's quoted form & "; exit 0")

Si vous voulez utiliser Safari pour ouvrir l'URL et le mettre au premier plan, alors:

Changer:

if fileURL is not "" then ¬
    do shell script ¬
        "open " & fileURL's quoted form

À:

if fileURL is not "" then ¬
    tell application "Safari"
        make new document with properties {URL:fileURL}
        activate
    end tell

L'exemple du code AppleScript peut être enregistré en tant que script shell avec un #!/usr/bin/osascript shebang, rendu exécutable et exécuté depuis Terminal.


Note: L'<em>exemple</em> du <strong>code</strong> <strong>AppleScript</strong> est tel quel et ne contient pas de gestion d'<em>erreur</em> incluse. Il incombe à l'utilisateur d'ajouter toute gestion d'<em>erreur</em> appropriée. Consultez les déclarations <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_control_statements.html#//apple_ref/doc/uid/TP40000983-CH6g-129232" rel="nofollow noreferrer"><strong>try</strong></a> et <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_control_statements.html#//apple_ref/doc/uid/TP40000983-CH6g-129657" rel="nofollow noreferrer"><strong>error</strong></a> dans le <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html" rel="nofollow noreferrer"><strong>Guide de Langage AppleScript</strong></a>. Consultez également, <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_error_xmpls.html#//apple_ref/doc/uid/TP40000983-CH221-SW1" rel="nofollow noreferrer"><strong>Travailler avec les Erreurs</strong></a>. De plus, l'utilisation de la commande <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html#//apple_ref/doc/uid/TP40000983-CH216-SW10" rel="nofollow noreferrer"><strong>delay</strong></a> peut être nécessaire entre les événements lorsque approprié, par exemple <code>delay 0.5</code>, avec la valeur du <em>delay</em> réglée de manière appropriée.

0 votes

Confirmé que cette solution fonctionne comme annoncé. Je vais probablement y jouer un peu plus tard lorsque j'en aurai l'occasion. Merci!

0 votes

Depuis que nous sommes de toute façon dans le monde d'AppleScript, j'ai remplacé do shell script "open " & fileURL's quoted form par tell application "Safari" to make new document with properties {URL:fileURL}, car cela ouvre l'URL dans une nouvelle fenêtre, plutôt que comme un onglet dans ma fenêtre la plus en avant. (En passant, je ne suis pas très fort en AppleScript. Savez-vous s'il y a un moyen de donner le focus à cette nouvelle fenêtre que je crée de cette manière, sans amener toute l'application Safari au premier plan?)

0 votes

À M. Justin, consultez la mise à jour dans la section "Si vous souhaitez utiliser Safari pour ouvrir l'URL et le mettre au premier plan, alors :" de ma réponse.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X