Как отлаживать мой скрипт?

Файлы /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 }}
0
11.12.2018, 20:25
4 ответа

Использование forдля циклического вывода программы может оказаться сложной задачей. Цикл whileпроще. Кроме того, я не думаю, что строка 2 делает то, что вы думаете. Попробуйте вместо этого:

ls $* | while read infilename; do
    outfilename=$(echo $infilename | sed 's/.md/.pdf/')
    pandoc $infilename -t "latex" -o ${outfilename}.pdf;
done
-1
28.01.2020, 04:07

Вы можете отлаживать скрипты с помощью команды 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)

1
28.01.2020, 04:07

В сценарии есть ряд ошибок, которые очевидны для более опытного сценариста. Но ваш вопрос был «как мне отлаживать».

Во-первых, :напишите сценарий разборчиво, а не в один -лайнер:

#!/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 аргументами:

  • тест
  • де
  • bye.md

, тогда как ls "$i"вызовет lsс одним аргументом:

  • тест от bye.md

, что приведет к совершенно другим результатам.

Еще вопрос :Вы уверены, что pandocустановлен в вашей системе? Сообщение об ошибке предполагает, что это не так. Проверьте с помощью which pandoc.

Для тех, кто делал Фортран (а я такой старый! ), i — целое число. Но вы также можете использовать описательные имена, которые облегчат обслуживание сценариев на более позднем этапе.

Итак,это сделало бы сценарий:

#!/bin/bash
for infile in "$@" ; do
    outfile=${infile%.md}.pdf
    pandoc "$infile" -t latex -o "$outfile"
done

Или что-то в этом роде.

0
28.01.2020, 04:07

Ваша петля:

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
0
28.01.2020, 04:07

Теги

Похожие вопросы