Файлы /etc/yum.conf и .repo в /etc/yum.repos.d/ определяют, какие репозитории использовать. В этих репозиториях есть файл repodata / primary.xml, который определяет местоположение (через поле «location») RPM.
Вероятно, вы не захотите интегрировать свое программное обеспечение в основное репозиторий компакт-дисков. Я бы создал его где-нибудь в ISO и использовал creatrepo. В конфигурации кикстарта вы можете добавить команды «repo», чтобы добавить это репо, используя, например, «repo --name = acme --baseurl = file: // mnt / cdrom / local / repos / acme.
{{1 }}Использование for
для циклического вывода программы может оказаться сложной задачей. Цикл while
проще. Кроме того, я не думаю, что строка 2 делает то, что вы думаете. Попробуйте вместо этого:
ls $* | while read infilename; do
outfilename=$(echo $infilename | sed 's/.md/.pdf/')
pandoc $infilename -t "latex" -o ${outfilename}.pdf;
done
Вы можете отлаживать скрипты с помощью команды set -x
, которая показывает, какие именно команды выполняются (вы можете отключить этот режим с помощьюset +x
). Из этого вы, вероятно, увидите, что вы запускаете цикл с несуществующими -файлами, а затем запускаете basename
неправильно.
Кроме того:
не анализировать вывод ls . for i in "$@"; do
вполне подойдет для вас.
basename
необходимо расширение в качестве отдельного аргумента, поэтому вы должны были написать basename $i ".md"
:, что вам не хватало этого пробела между переменной, содержащей имя файла, и расширением.
вы должны заключать переменные в кавычки, если они содержат пробелы, так что вы на самом деле хотите basename "$i".md
иpandoc "$i" -t "latex" -o "$x".pdf
echo
является избыточным, вы также можете использоватьx=$(basename "$i".md)
В сценарии есть ряд ошибок, которые очевидны для более опытного сценариста. Но ваш вопрос был «как мне отлаживать».
Во-первых, :напишите сценарий разборчиво, а не в один -лайнер:
#!/bin/bash
for i in $(ls $*) ; do
x=$(echo $(basename $i".md"))
pandoc $i -t "latex" -o $x.pdf
done
Вы заметите, что я добавил #!/bin/bash
. Это заставляет использовать bash
для сценария. Итак, как это отладить?
$i
— переменная цикла; содержит ли он то, что вы думаете, когда проходите цикл? Эхо прояснит это. Вы можете сделать то же самое для своего $x:
#!/bin/bash
for i in $(ls $*) ; do
echo "LOOP VARIABLE $i"
x=$(echo $(basename $i".md"))
echo "AND X IS $x"
pandoc $i -t "latex" -o $x.pdf
done
Это основной способ отладки.
Итак, теперь вернемся к вашему сценарию, выводу и т. д. Правильно ли я понимаю, что у вас есть файл с именем «test de bye.md
» в вашем каталоге?
Хорошо. Начните с самого начала (на самом деле :отсутствующий @!
был тем, но это придирки ). Никогда не анализируйте вывод ls
. Меня много раз ругали за это, и здесь вы можете прочитать почему.
Вас также может заинтересовать разница между $*
и $@
, которую я оставлю на ваше усмотрение.
Конструкция x=$(echo $(basename $i".md"))
причудлива. Я даже не понимаю, что вы пытаетесь здесь сделать, особенно если вы уже вызываете скрипт с .md
в конце имени файла.
Вы также можете заключить в кавычки аргументы, в которых есть пробелы. Например, :, если $i будет содержать test de bye.md
, ls $i
вызовет `ls с 3 аргументами:
, тогда как ls "$i"
вызовет ls
с одним аргументом:
, что приведет к совершенно другим результатам.
Еще вопрос :Вы уверены, что pandoc
установлен в вашей системе? Сообщение об ошибке предполагает, что это не так. Проверьте с помощью which pandoc
.
Для тех, кто делал Фортран (а я такой старый! ), i — целое число. Но вы также можете использовать описательные имена, которые облегчат обслуживание сценариев на более позднем этапе.
Итак,это сделало бы сценарий:
#!/bin/bash
for infile in "$@" ; do
outfile=${infile%.md}.pdf
pandoc "$infile" -t latex -o "$outfile"
done
Или что-то в этом роде.
Ваша петля:
for i in $(ls $*);do
x=$(echo $(basename $i".md"));
pandoc $i -t "latex" -o $x.pdf;
done
Исправленная версия:
#!/bin/sh
for pathname do
pandoc "$pathname" -t "latex" -o "$( basename "$pathname".md ).pdf"
done
Примечания:
Чтобы перебрать аргументы командной строки, просто выполните for variable do...; done
. $*
— это позиционные параметры, объединенные с первым символом $IFS
, и вам очень редко нужно его использовать. Поскольку он не заключен в кавычки, результат был бы разделен на пробелы, что является причиной некоторых сообщений об ошибках, которые вы получаете (изls
). Разделенные слова также будут подвергаться подстановке имен файлов. Вывод ls
предназначен исключительно для , смотрящего на (, и в любом случае нет причин перечислять имена файлов, поскольку они передаются вам в командной строке ).
$(echo $(some-utility))
правильнее писать как $(some-utility)
. echo
не требуется, и в некоторых случаях, когда данная утилита выводит обратную косую черту и т. д., вводятся интересные эффекты. Кроме того, на выходе могло произойти разделение слов и подстановка имен файлов.
Я решил не использовать промежуточную переменную. Вы просто используете его один раз в любом случае. Я также догадался, что вы хотели удалить суффикс имени файла .md
, и я использовал более описательное имя переменной для цикла. Обратите внимание, что вы, кажется, пишете в файлы в текущем каталоге, даже если вам могут быть даны пути, которые могут содержать подкаталоги, такие как somedir/file.md
.
Вариант, который записывает в файлы в том же каталоге, где находится исходный .md
файл:
#!/bin/sh
for pathname do
pandoc "$pathname" -t "latex" -o "${pathname%.md}.pdf"
done