Создание командного цикла в оболочке с помощью скрипта - PullRequest
3 голосов
/ 11 июля 2010

Как можно зациклить команду / программу в оболочке Unix, не записывая цикл в сценарий или другое приложение.

Например, я написал сценарий, который выводит значение датчика освещенности, но я по-прежнемутестирую его прямо сейчас, поэтому я хочу, чтобы он запускался в цикле путем многократного запуска исполняемого файла.

Может быть, я также хотел бы просто запустить "ls" или "df" в цикле.Я знаю, что могу легко сделать это в нескольких строках кода bash, но возможность набирать команду в терминале для любого данного набора команд была бы для меня такой же полезной.

Ответы [ 4 ]

5 голосов
/ 11 июля 2010

Вы можете написать точно такой же цикл, который вы написали бы в сценарии оболочки, написав его в одну строку, поставив точку с запятой вместо возврата, как в

for NAME [in LIST ]; do COMMANDS; done

В этот момент вы могли бы написать сценарий оболочки, например, repeat, который при наличии команды запускает ее N раз, просто изменив COMMANDS на $1.

2 голосов
/ 11 июля 2010

Я рекомендую использовать «watch», он просто делает именно то, что вы хотите, и он очищает терминал перед каждым выполнением команд, поэтому легко отслеживать изменения.

Возможно, у вас уже есть, просто попробуйте watch ls или watch ./my_script.sh. Вы даже можете контролировать, сколько времени ждать между каждым выполнением, в секундах, с помощью опции -n, и вы можете использовать -d, чтобы выделить разницу в результатах последовательных запусков.

Попробуйте:

Запуск ls каждую секунду:

watch -n 1 ls

Запускать my_script.sh каждые 3 секунды и выделять различия:

watch -n 3 -d ./my_script.sh

страница программы просмотра часов: http://linux.die.net/man/1/watch

2 голосов
/ 11 июля 2010

Это не совсем отвечает на ваш вопрос, но я чувствовал, что это было относительно. Одна из замечательных особенностей зацикливания оболочки заключается в том, что некоторые команды возвращают списки элементов. Конечно, это очевидно, но с помощью цикла for вы можете выполнить команду из этого списка элементов.

for $file in `find . -name *.wma`; do cp $file  ./new/location/ done;

Вы можете проявить творческий подход и сделать что-то очень мощное.

1 голос
/ 11 июля 2010

Помимо принятия аргументов, все, что вы можете сделать в скрипте, может быть сделано в командной строке. Ранее я набирал это непосредственно в bash, чтобы посмотреть, как каталог заполняется при передаче файлов:

while sleep 5s
do
  ls photos
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...