#bash #while-loop #break
#bash #цикл while #перерыв
Вопрос:
Я пытался разорвать цикл, который я создал с помощью ctrl C во время чтения файла.
Вместо этого он просто останавливал конкретную итерацию, а не весь цикл.
Как я могу полностью остановить его вместо того, чтобы нажимать ctrl C на всех итерациях?
Весь сценарий можно найти здесь
Пример файла выглядит так:
echo -e "SRR7637893nSRR7637894nSRR7637895nSRR7637896" > filenames.txt
Конкретный фрагмент кода, который, вероятно, создает проблему, — это цикл while здесь (set -xv; был добавлен впоследствии, как предложено markp-fuso в комментариях):
set -xv;
while read -r line; do
echo "Now downloading "${line}"n"
docker run --rm -v "$OUTPUT_DIR":/data -w /data inutano/sra-toolkit:v2.9.2 fasterq-dump "${line}" -t /data/shm -e $PROCESSORS
if [[ -s $OUTPUT_DIR/${line}.fastq ]]; then
echo "Using pigz on ${line}.fastq"
pigz --best $OUTPUT_DIR/"${line}*.fastq"
else
echo "$OUTPUT_DIR/${line}.fastq not found"
fi
done < "$INPUT_txt"; set xv
Комментарии:
1. Не совсем понятно (для меня), что вы пытаетесь сделать. Знаете ли вы, что есть
break
ключевое слово, которое вы могли бы добавить в любом месте внутри циклической структуры, чтобы остановить обработку цикла? Если у вас возникли проблемы с его использованием, ваш вопрос должен включать протестированныйbreak
код и небольшой набор примеров ввода и ожидаемых результатов / действий. Удачи.2. Лучше исправить код, чтобы допустимые имена файлов не завершались ошибкой. Вероятно, все, что вам нужно, это
pigz ... .../"$line"
. Ctrl-C убивает текущий процесс (что-то связанное сpigz ...
(вероятно)), поэтому вам нужно очень быстро выполнить другой Ctrl-C, чтобы прервать родительский скрипт. Поэтому попробуйте выполнить комбинацию клавиш Ctrl-Cs как можно быстрее, и это может остановить скрипт. Удачи.3.
echo "downloading the files ...processors
отсутствует завершающая двойная кавычка ("
); это опечатка при вырезании / вставке в вопрос? или вам действительно не хватает"
завершения в вашем скрипте?; это помогло бы узнать, где в скрипте происходит зависание… во времяdocker
вызова? во времяpigz
вызова? в другом месте? (попробуйтеset -xv; while ... done < "$INPUT_txt"; set xv
включить отладку во время выполнения кода)4. Хороший совет от @markp-fuso (как обычно). Нет, pigz, вероятно, работает нормально, гораздо более вероятно, что что-то не так со значением
$line
переменной, И обычная проблема заключается в том, что в имени файла есть пробел ИЛИ, что менее вероятно, но возможно,#!@#$%^amp;*()
все это имеет особое значение для оболочки, если они не находятся внутри dbl-цитата, следовательноpigz ... .../"$line"
. (обратите внимание, что$line
теперь он окружен dbl-кавычками.) Удачи.5. также может помочь добавить тест,
if [[ -f "$line" ]] : then do pigz stuff ; else echo "error : no file named $line" >amp;2 ; fi
. Удачи.