Как получить подсказку после каждой итерации цикла while?

Используйте команду find -exec :

find ~/target_dir/ -iname '*some*' -depth 1 -exec mdls {} \;

Это запустит mdls для каждого подходящего имени файла, найденного с помощью find . Он будет работать с любым именем файла, даже если он содержит пробелы или символы новой строки и т. Д.

, если mdls может работать с несколькими именами файлов в командной строке, вы можете завершить команду -exec с помощью + вместо \; . например

find ~/target_dir/ -iname '*some*' -depth 1 -exec mdls {} +
0
30.05.2019, 11:31
1 ответ

Ваш read -pвнутри цикла "пропускается" (не совсем ), потому что он читает из input.txt. Все команды внутри цикла по умолчанию наследуют свой стандартный входной поток из цикла, и это связано сinput.txt

Вместо этого вам придется заставить read lineчитать из нового дескриптора входного файла и передать содержимое файла по этому:

while IFS= read -r line <&3; do
    printf '%s logs\n\n' "$line"
    tail -n 100 "Domain1.$line"
    read -p 'Press Enter to continue'
done 3<input.txt

Здесь мы используем файловый дескриптор 3 (следующий свободный и доступный файловый дескриптор после стандартных )и подключаем его к входному файлу. Затем мы явно просим read lineпрочитать из этот файловый дескриптор , а не из стандартного ввода (файлового дескриптора 0 ). Это оставляет стандартный ввод свободным, и read -pбудет считывать его как обычно.

Кроме того, вы можете поменять местами дескрипторы входных файлов из цикла выше:

while IFS= read -r line; do
    printf '%s logs\n\n' "$line"
    tail -n 100 "Domain1.$line"
    read -p 'Press Enter to continue' <&3
done 3<&0 <input.txt

Теперь read lineчитает из файла через обычный стандартный ввод, унаследованный от цикла, в то время как read -pчитает из файлового дескриптора 3. Файловый дескриптор 3 открывается как копия стандартного ввода до того, как стандартный ввод будет перенаправлен из файла..

В оболочке bash,

read <&3

можно также написать

read -u 3

Таким образом, "самое чистое" решение (в смысле содержащего наименьшее количество синтаксиса манипулирования файловыми дескрипторами )может быть чем-то вроде

while IFS= read -u 3 -r line; do
    printf '%s logs\n\n' "$line"
    tail -n 100 "Domain1.$line"
    read -p 'Press Enter to continue'
done 3<input.txt
3
28.01.2020, 02:22

Теги

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