2013-11-02 3 views
0
for i in {1...50000}; 
do 
    $(sudo lsof -Pni | cut -f 1 -d ' ' > fd_history/$(date +"%H-%M-%S")); 
done 

Предполагается, что вывод lsof будет передан в файл, названный в честь текущей метки времени (только первый токен каждой выходной линии lsof). Каждый lsof занимает несколько секунд, так как есть много открытых файлов.Почему этот bash для цикла повторяется только один раз?

Цикл завершается после первой итерации, а не непрерывно работает lsof. Зачем? (Я печатаю эту строку прямо на моей консоли, кстати.)

+3

Две точки. '{1..50000}' – Kevin

+1

Невероятно, что исправил его. –

+2

Возможно, вам не нужна нотация '$ (...)'; он выполняет команду внутри, фиксирует вывод, а затем пытается запустить команду на выходе. К счастью, вы отправили стандартный вывод в файл, поэтому ничего не получится выполнить, но удаление нотации поможет вам немного времени (едва измеримое, но ...). –

ответ

3

У Вас есть дополнительная точка там: {1...50000} должно быть {1..50000}; первый не расширяется.

1

Использование seq.

for i in $(seq 50000); 
do 
    $(sudo lsof -Pni | cut -f 1 -d ' ' > fd_history/$(date +"%H-%M-%S")); 
done 

Или

for i in {1..50000}; 
do 
    $(sudo lsof -Pni | cut -f 1 -d ' ' > fd_history/$(date +"%H-%M-%S")); 
done 
Смежные вопросы