如何打开PDF作为BASH变量?


1

我正在尝试使用Preview打开PDF,其中输入文件是shell var:

$ 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 -

等等

我总是得到同样的错误:

-bash:/ usr / bin / open:参数列表太长

是否有可能做到这一点?

任何想要尝试的人的示例PDF:

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

Answers:


4

很酷的问题显示bash,管道和开放是多么惊人。你是 很近 在第四次尝试:

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

幸运的是 -a 参数让我们 -f 从stdin获取数据但不在TextEdit中打开。


回到你的身边,@ lily - 在检查手册页之前我尝试了很多一半的努力,并希望这两个选项能够正常工作。
bmike

这个答案并不完整,问题特别提到使用Preview打开PDF,其中输入文件是shell var。
Dials Mavis

我印象非常深刻 - 我不希望这个有用,但确实如此!
Gordon Davisson

1

您可以像这样打开PDF作为Bash变量(表示为文件的路径)。

  1. 设置你的变量:

    pdf=/path/to/44592-linux-restricted-shell-bypass-guide.pdf
    
  2. 像这样打开文件:

    open "$pdf" -a Preview
    

但是,您的示例表明文件系统上不存在该文件。如果要打开存储在变量中的原始数据流,我建议回显您的变量,然后将其汇总到 open 使用 -f 像这样的选项。

  1. 定义你的变量:

    pdf=$(wget -qO- https://www.exploit-db.com/docs/english/44592-linux-restricted-shell-bypass-guide.pdf)
    
  2. 从标准输入打开原始数据作为流:

    echo $pdf | open -f -a Preview
    

说明: 如果存储输出 wget -qO- … 作为变量,而不是将文件下载到您的文件系统, open 当你传递原始文件数据而不是文件路径时,它将不知道该怎么做。在 man open 'file'指的是给定应用程序的可打开文件,示例中的变量不是那个。该 -f 选项在此方案中很有用,因为设置变量的方法涉及存储整个文件流,而不会将其解释为文件 open,因此它只能作为文件流打开。


2
这不起作用,因为它会以多种方式破坏文件。首先,变量不适用于二进制数据,尤其是包含空字符(零字节)的任何内容。其次,使用不带双引号的变量引用会使值受到分词和通配符扩展。最后, echo 在打印内容的末尾添加换行符。您可以使用解决最后两个问题 printf "%s" "$pdf" 代替 echo $pdf,但第一个更难解决。你必须做一些事情,比如将它存储在base64编码中。
Gordon Davisson

感谢您的反馈,戈登。我做到了 了解变量和空数据。那么有效的问题最初是不可能实现的?
Dials Mavis

我应该提一下,这个代码确实在这个例子中成功运行。
Dials Mavis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.