¿Cómo abrir PDF como variable BASH?

Estoy tratando de abrir un PDF usando Vista previa donde el archivo de entrada es una var de shell:

$ pdf=$(wget -qO- 'http://website.com/file.pdf') && open "$pdf"

$ pdf=$(wget -qO- 'http://website.com/file.pdf') && open -a /Applications/Preview.app -f "$pdf"

$ open -a /Applications/Preview.app $(wget -qO- 'http://website.com/file.pdf')

$ pdf=$(wget -qO- 'http://website.com/file.pdf') | open -a /Applications/Preview.app -f -

etc etc etc etc

Siempre me sale el mismo error:

-bash: /usr/bin/open: Lista de argumentos demasiado larga

¿Es posible hacer esto?

PDF de ejemplo para quien quiera probar:

https://www.exploit-db.com/docs/english/44592-linux-restricted-shell-bypass-guide.pdf

Respuestas (3)

Genial problema que muestra lo asombrosos que son bash, pipes y open. Estás tan cerca en el cuarto intento:

wget -qO- 'https://www.com/big.pdf' | open -f -a Preview.app

Afortunadamente, el -aargumento permite -ftomar los datos de stdin pero no abrirlos en TextEdit.

De vuelta a ti, @lily: me divertí probando muchos esfuerzos a medias antes de consultar la página de manual y esperar que las dos opciones funcionaran.
Esta respuesta no está completa, la pregunta se refiere específicamente a abrir un PDF usando Vista previa donde el archivo de entrada es una var de shell.
Estoy realmente impresionado, no hubiera esperado que esto funcionara, ¡pero funciona!

Puede abrir un PDF como una variable Bash (expresada como una ruta al archivo) de esta manera.

  1. Establece tu variable:

    pdf=/path/to/44592-linux-restricted-shell-bypass-guide.pdf
    
  2. Abre el archivo así:

    open "$pdf" -a Preview
    

Sin embargo, su ejemplo indica que el archivo no existe en su sistema de archivos. Si desea abrir un flujo de datos sin procesar almacenado en una variable, le recomiendo hacer eco de su variable y canalizarla para openusar la -fopción como esta.

  1. Defina su variable:

    pdf=$(wget -qO- https://www.exploit-db.com/docs/english/44592-linux-restricted-shell-bypass-guide.pdf)
    
  2. Abra los datos sin procesar como una secuencia desde la entrada estándar:

    echo $pdf | open -f -a Preview
    

Explicación: si almacena la salida de wget -qO- …como una variable, en lugar de descargar el archivo en su sistema de archivos, openno sabrá qué hacer, ya que le está pasando los datos del archivo sin procesar en lugar de la ruta al archivo. En man open'archivo' se refiere a un archivo que se puede abrir para la aplicación dada, la variable en su ejemplo no es esa. La -fopción es útil en este escenario, ya que su método para establecer la variable implica almacenar todo el flujo de archivos, que no se interpretará como un archivo openy, por lo tanto, solo se puede abrir como un flujo de archivos.

Esto no funcionará porque corromperá el archivo de varias maneras. Primero, las variables no son adecuadas para datos binarios, especialmente cualquier cosa que contenga caracteres nulos (cero bytes). En segundo lugar, el uso de una referencia de variable sin comillas dobles someterá el valor a división de palabras y expansión de comodines. Finalmente, echoagrega una nueva línea al final de lo que imprime. Puede resolver los dos últimos problemas usando printf "%s" "$pdf"en lugar de echo $pdf, pero el primero es más difícil de resolver. Tendrías que hacer algo como almacenarlo en codificación base64.
Gracias por los comentarios, Gordon. No sabía eso sobre variables y datos nulos. Entonces, ¿no es posible lo que la pregunta originalmente intenta lograr?
Sin embargo, debo mencionar que este código se ejecuta con éxito para este ejemplo.

Lo mismo que sugirió @bmike pero sin wgetlo cual no es nativo de OS X

curl -so- 'https://www.example.com/some.pdf' | open -f -a Preview.app