как выйти из цикла while, который считывает файл в bash

#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 . Удачи.