исполняемый файл pkftk.jar со скриптом bash текущий каталог pdftk

340
Dan Hunt

В Ubuntu-16.04 программа командной строки pdftk была удалена. Я использую pdftk каждый день, поэтому я работаю над этим PDFTK-форком https://gitlab.com/marcvinyals/pdftk, следуя инструкциям на https://askubuntu.com/questions/1028522/how-can-i-install -pdftk-в-убунту-18-04-bioni

#!/bin/bash java -jar pdftk.jar 

Теперь я собрал bash-скрипт с именем pdftk с кодом выше, поместил его /usr/local/bin/и сделал его исполняемым с

sudo chmod +x /usr/local/bin/pdftk 

Я скопировал pdftk.jarфайл /usr/local/bin/и сделал его исполняемым с помощью той же команды.

Не работает, как я надеялся прямо сейчас:

me@mine:~/M$ sudo ls -l /usr/local/bin/pdftk ---xr-xr-x 1 root root 32 May 3 13:38 /usr/local/bin/pdftk  me@mine:~/M$ sudo ls -l /usr/local/bin/pdftk.jar -rwxr-xr-x 1 root root 742367 May 2 16:32 /usr/local/bin/pdftk.jar 

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

me@mine:~/M$ pdftk *.pdf output john.pdf Error: Unable to access jarfile pdftk.jar 

Что я сделал не так?

3
Ну, теперь он показывает мне файл справки pdftk. Dan Hunt 6 лет назад 0
извините, я забыл добавить `" $ @ "`, который передает аргументы (начинающиеся с `$ 1`) в качестве аргументов в кавычках для вызова` java`. Итак, вы получили вывод справки, потому что аргументы, которые вы передали сценарию оболочки, не были переданы. Я исправил свой ответ соответственно. 0xC0000022L 6 лет назад 0

1 ответ на вопрос

2
0xC0000022L

Если pdftk.jarи ваш pdftkсценарий оболочки живут бок о бок внутри, /usr/local/binвсе, что необходимо, - это передать фактический путь к файлу JAR. Вы можете сделать это в сценарии оболочки следующим образом:

#!/usr/bin/env bash java -jar /usr/local/bin/pdftk.jar "$@" 

или, на мой взгляд, более надежное решение:

#!/usr/bin/env bash java -jar "$0.jar" "$@" 

Последний использует имя сценария оболочки и добавляет .jarсуффикс. Это все, что на самом деле делает. Так что, пока они оба живут в одном каталоге, это должно работать. Даже если вы перемещаете их в тандеме. В то время как первое решение потребует, чтобы вы настроили сценарий оболочки, чтобы использовать новый путь к файлу JAR.

Я предпочитаю также ставить двойные кавычки, потому что, если вы когда-нибудь решите скопировать два файла в путь с пустым пространством, сценарий прервется.

Я также изменил hashbang, так как он более переносим (для разных версий Linux и BSD).

Возможно, лучшей идеей было бы вставить файл jar в `/ usr / local / lib`. jpaugh 6 лет назад 0
@jpaugh да, спорно. Но это немного усложнит сценарий оболочки. Затем он должен выполнить `java -jar" $ . Jar "` (если вы не знакомы со строковыми подстановками в Bash, это довольно глоток, чтобы жевать ) ... при условии, что единственным отличием в пути является `/ bin /` против `/ lib /`. 0xC0000022L 6 лет назад 0
me @ mine: ~ / рабочий стол $ / usr / local / bin / pdftk * .pdf вывод bob.pdf Синтез pdftk [input_pw ] [ ] Для полной справки: pdftk --help Dan Hunt 6 лет назад 0
@ 0xC0000022L Спасибо. Отлично работает сейчас со второй цитатой. java -jar "$ 0.jar" "$ @" Dan Hunt 6 лет назад 0