Come posso eseguire uno script di shell che richiede l'input dell'utente da Applescript

5

Ho due pezzi di codice. Uno è Applescript e l'altro uno script di shell Bash. Lo script della shell deve essere eseguito contemporaneamente al applescript, restituire alcuni valori e quindi uscire. Il problema è che la richiesta di read -p dello script di shell non viene messa in pausa per l'input dell'utente quando viene chiamata da applescript usando do shell script "/path/to/script.sh" .

Ho pensato che forse

display dialog "Query?" default answer ""
set T to text returned of result

potrebbe sostituire il prompt read -p ma non riesco a capire come fare in entrambi i casi il lavoro. In che modo utilizzare uno di questi metodi per chiedere e aspettare correttamente l'immissione dell'utente?

Mi rendo conto che potrei tagliare il applescript in due sezioni posizionandone uno all'inizio dello script della shell e uno dopo l'ultimo comando della shell.

#!/bin/bash

osascript ~/Start_Script.scpt

echo 'enter some Text'
read -p "" T

## for things in stuff do more 
## stuff while doing other things
## done 

osascript ~/End_Script.scpt

Questo è quello che ho fatto e funziona. Ma richiede l'uso del terminale che va bene per me. Ma se volessi mostrare qualcuno come mia mamma ... beh, non aprirà l'app del Terminale. Quindi sarebbe bello trovare un modo per emulare il comando read -p all'interno di Applescript stesso ed essere in grado di passare una variabile lungo lo script della shell incorporata.

    
posta I0_ol 27.05.2016 - 10:49
fonte

2 risposte

3

AppleScript incorporato in uno script di shell è spesso disordinato, difficile da leggere e difficile da citare correttamente.

Mi aggiro usando questo tipo di costrutto.

#!/usr/bin/env bash

read -r -d '' applescriptCode <<'EOF'
   set dialogText to text returned of (display dialog "Query?" default answer "")
   return dialogText
EOF

dialogText=$(osascript -e "$applescriptCode");

echo $dialogText;

-ccs

    
risposta data 01.06.2016 - 05:04
fonte
3

Penso che quello che ti serve è:

set T to text returned of (display dialog "Query?" buttons {"Cancel", "OK"} default button "OK" default answer "")

Se vuoi farlo da uno script bash, devi fare:

osascript -e 'set T to text returned of (display dialog "Query?" buttons {"Cancel", "OK"} default button "OK" default answer "")'

Posso spiegarlo in modo più dettagliato se ne hai bisogno, ma penso che sia abbastanza intuitivo.

EDIT: se vuoi che il risultato sia una variabile di shell, fai:

SHELL_VAR='osascript -e 'set T to text returned of (display dialog "Query?" buttons {"Cancel", "OK"} default button "OK" default answer "")''

Tutto ciò che scrivi tra i backtick ('') viene valutato (eseguito) dalla shell prima del comando principale. Vedi questa risposta per ulteriori informazioni.

Sono d'accordo che questo è un po '"hacky", e sono sicuro che ci sono modi migliori per farlo, ma funziona.

    
risposta data 27.05.2016 - 13:41
fonte

Leggi altre domande sui tag