1 votos

Cómo suprimir la salida estándar al usar `osascript` para escribir una tecla

Estoy planeando crear un script de AppleScript para "escribir" una cadena en la línea de comandos, pero mi script:

cmd="echo 'abc'"
osascript -e "tell application \"System Events\" to keystroke \"${cmd}\""

siempre muestra la salida estándar, incluso si uso >/dev/null 2>&1, como se ve en la captura de pantalla a continuación:

Captura de pantalla de comandos osascript

¿Existe alguna solución para suprimir la salida estándar y simplemente "escribir" la cadena?


actualización 1

si la variable cmd es una cadena muy larga, la "1ra" salida muestra un máximo de 57 caracteres (como se ve a continuación). ¿Existe alguna solución para "marcar" la primera salida a 0 carácter?

cmd='una-cadena-muy-muy-muy-muy-muy-muy-muy-muy-muy-muy-muy-muy-muy-larga'
osascript -e "tell application \"System Events\" to keystroke \"${cmd}\""

introducir descripción de la imagen aquí


actualización 2

gracias @jaume por la solución, ¡usar bash -c "... &" funciona perfecto! :)

detalles:

$ cmd='algo'
$ bash -c "osascript -e \"tell application \\\"System Events\\\" to keystroke \\\"${cmd}\\\"\" &"

introducir descripción de la imagen aquí

trabajando con fzf (código fuente), enlace demo: https://streamable.com/8qkgza

1voto

Phill Puntos 126

¿Por qué se muestra la salida dos veces?

Eso no es la salida estándar de osascript lo que ves sino System Events escribiendo "echo 'abc'".

Lo ves dos veces porque System Events lo escribe mientras osascript está corriendo. Cuando osascript termina y devuelve el control al shell, el shell muestra el nuevo indicador, y también muestra cualquier entrada escrita previamente, en este caso "echo 'abc'".

Es decir, no hay ninguna salida estándar que suprimir, es simplemente la forma en que funciona el shell.

Este comportamiento no es exclusivo de osascript, por ejemplo, si comprimes un archivo grande con el comando zip y escribes algo antes de que zip termine, el texto también se muestra dos veces.

¿Cómo se puede suprimir la "doble salida"?

Puedes suprimir la salida al retrasar ligeramente cuándo se escribe la cadena en la ventana del Terminal. Esto se puede lograr con una función de shell:

  1. Abre Terminal.

  2. Escribe el siguiente texto y presiona Enter:

     function t { zsh -c "osascript -e \"do shell script \\\"/bin/sleep 1\\\"\" -e \"tell application \\\"System Events\\\" to keystroke \\\"${cmd}\\\"\" &"; }

    Puedes reemplazar zsh con bash en la función anterior si prefieres este último:

     function t { bash -c "osascript -e \"do shell script \\\"/bin/sleep 1\\\"\" -e \"tell application \\\"System Events\\\" to keystroke \\\"${cmd}\\\"\" &"; }

    (Ambas funciones son totalmente equivalentes y se pueden utilizar indistintamente con tanto zsh como bash.)

  3. Define cmd (si no lo haces, la función no escribirá nada):

     cmd="echo 'abc'"
  4. Ejecuta la función:

     t

Ahora, t devolverá inmediatamente y luego el texto se agregará a la línea actual.

La función funciona con los shells integrados de macOS zsh y bash.

Puedes agregar la función a tu archivo de inicio de shell para no tener que escribirla cada vez que abras Terminal:

  1. Para zsh, agrégalo a un archivo llamado .zshrc en tu carpeta de inicio. Para abrir .zshrc, escribe open -a TextEdit ~/.zshrc. Después de agregar la línea, guarda el archivo modificado con S y cierra TextEdit con Q.
  2. Para bash, agrégalo a un archivo llamado .bashrc en tu carpeta de inicio. Para abrir .bashrc, escribe open -a TextEdit ~/.bashrc. Después de agregar la línea, guarda el archivo modificado con S y cierra TextEdit con Q.

¿Cómo funciona la función?

La función ejecuta zsh (o bash, si elegiste la segunda función) para enviar el comando osascript al fondo (eso se hace con el & al final de la función).

osascript espera primero medio segundo (para que la función devuelva el control al shell) y luego escribe la cadena.

¿Cómo puedo renombrar la función?

Llamé a la función t, pero puedes renombrarla reemplazando el t en function t, por ejemplo, function typecmd.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X