Использование петли Bash для запуска программы, которая использует однозначные кавычки в командной строке, где односмысленные цитаты аннулируют намерение сценария Bash

Достаточно простой способ убить циклы, запущенные интерактивно, - остановить команду (Ctrl-Z), которая должна вывести номер задания, скажем [2]+ Stopped, которое затем можно убить, используя kill %2.

0
04.09.2018, 12:40
1 ответ

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

В этом случае одинарные кавычки ничего не делают, так как строка, которую они заключают в кавычки, является простой строкой без расширений для выполнения оболочкой (это ошибка в вашем коде, вы, вероятно, хотели $outputfileс двойным кавычки ).

Если ваши файлы находятся в текущем каталоге (и только там ), вы можете сделать

for fasta in./*.fna; do
    barrnap --outseq "${fasta%.fna}.rrna" "$fasta"
done

или, с промежуточной переменной,

for fasta in./*.fna; do
    outfile="${fasta%.fna}.rrna"
    barrnap --outseq "$outfile" "$fasta"
done

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

Если ваши файлы расположены в любом количестве подкаталогов в текущем каталоге, и вам нужно использовать find, то не зацикливайте вывод find, а пусть findвызовет вашу программу:

find. -type f -name '*.fna' -exec sh -c '
    for fasta do
        barrnap --outseq "${fasta%.fna}.rrna" "$fasta"
    done' sh {} +

Здесь findдействует как генератор имен путей для цикла оболочки.

Связанные:


В вашем коде также есть пара синтаксических ошибок в том, что присваивания должны выполняться без пробелов вокруг =. Кроме того, расширения переменных должны заключаться в двойные кавычки.

2
28.01.2020, 02:42

Теги

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