Как открыть PDF как переменную BASH?

Я пытаюсь открыть PDF-файл с помощью предварительного просмотра, где входной файл представляет собой оболочку 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

Ответы (3)

Крутая задачка, показывающая, насколько хороши bash, pipe и open. Ты так близок с четвертой попытки:

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

К счастью, -aаргумент позволяет -fбрать данные со стандартного ввода, но не открывать их в TextEdit.

Возвращаясь к вам, @lily - мне было весело пробовать много половинчатых усилий, прежде чем проверять справочную страницу и надеяться, что два варианта сработают.
Этот ответ не является полным, вопрос конкретно относится к открытию PDF-файла с использованием предварительного просмотра, где входной файл представляет собой оболочку var.
Я действительно впечатлен - я бы не ожидал, что это сработает, но это работает!

Вы можете открыть 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«файле» имеется в виду открываемый файл для данного приложения, переменная в вашем примере не такова. Этот -fпараметр полезен в этом сценарии, так как ваш метод установки переменной предполагает сохранение всего файлового потока, который не будет интерпретироваться как файл open, и поэтому его можно открыть только как файловый поток.

Это не сработает, потому что это повредит файл несколькими способами. Во-первых, переменные не подходят для двоичных данных, особенно любых, содержащих нулевые символы (нулевые байты). Во-вторых, использование ссылки на переменную без двойных кавычек приведет к разбиению значения на слова и раскрытию подстановочных знаков. Наконец, echoдобавляет новую строку в конец того, что он печатает. Вы можете решить две последние задачи, используя printf "%s" "$pdf"вместо echo $pdf, но первую решить сложнее. Вам нужно будет сделать что-то вроде сохранения в кодировке base64.
Спасибо за отзыв, Гордон. Я не знал, что о переменных и нулевых данных. Таким образом, невозможно то, чего изначально пытается достичь вопрос?
Однако я должен упомянуть, что этот код действительно успешно работает для этого примера.

То же самое, что предложил @bmike, но без wgetчего не является родным для OS X

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