выполнение команды bash после завершения другой

#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