#linux #bash #shell #loops
#linux #bash #оболочка #циклы
Вопрос:
У меня есть список файлов и вызвана моя небольшая программа app
. Мой список — file01.txt
to file1000.txt
. Я хочу создать скрипт bash, который запускается один за другим:
app -i list01.txt # to the file1000.txt
Я хочу выполнять команды одну за другой, когда завершается предыдущая команда. Правильно ли я делаю это в своем примере?
#!/bin/bash
app -i list01.txt;
app -i list02.txt;
app -i list03.txt;
Комментарии:
1. Да, это должно сработать — при
app
условии, что выполняется синхронно и не демонизирует себя. Хотя, если у вас много файлов или вы хотите, чтобы они были динамическими, тогда лучше использовать цикл и динамически генерировать имена файлов.2. Может быть, вы могли бы сделать это в цикле для всех файлов с помощью чего-то вроде
for f in list*.txt; do app -i "$f"; done
.3. Итак, только однозначные числа дополняются одним дополнительным нулем?
4. что насчет вывода, мне интересно, будет ли вывод тем же файлом, могу ли я использовать $RANDOM, например, для f в list *.txt; do app -i «$ f -o $RANDOM.csv»; готово
5. Может быть, задание для
xargs
?
Ответ №1:
Если ваше приложение работает в стандартном режиме CLI (терминала) на переднем плане, вы правы. Таким образом, все выполняется один за другим, сверху вниз.
Другой способ запуска app2
только после app1
этого заключается в следующем:
app1 amp;amp; app2
Комментарии:
1. спасибо, да, я компилирую свой код, написанный в двоичном файле go to, используя makefile build-linux: GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o bin/app.linux-amd64 *.go
2. ДА. Тогда вы правы, то, что вы написали, будет идти сверху вниз, никаких сюрпризов.
Ответ №2:
Вы можете использовать seq
для генерации всех команд:
seq -f 'echo app -i file.0f.txt' 1 1000 | sh
Если вывод выглядит правильно, удалите echo