2015-05-28 3 views
0

Я писал небольшой скрипт оболочки в bash для измерения скорости нескольких исполняемых файлов с помощью команды time. Потому что я хотел время несколько различных программ, чтобы избежать повторения себя я спас команду времени и строка формата я хотел и пытался использовать расширение переменной (тестирование производительности ls в качестве примера):Расширение переменной Bash нельзя комбинировать с командой времени

#!/usr/bin/env bash 

timer="/usr/bin/time -f 'elapsed time: %E' --" 
$timer ls 1>/dev/null 

time команда должна использовать --, чтобы отделить ее параметры (в данном случае строку формата) от команды, которую она должна использовать во времени. Однако в этом сценарии time настаивает на том, чтобы выполнить свою строку формата и не с

/usr/bin/time cannot run time:: No such file or directory 
Command exited with non-zero status 127 
'elapsed 

Но если я положил всю команду на одной строке, без расширения переменной он корректно распознает формат строки и выполняет ls:

#!/usr/bin/env bash 

/usr/bin/time -f 'elapsed time: %E' -- ls 1>/dev/null 

производит «истекшее время: 0: 00,00»

Я в конечном итоге просто печатала всю команду на каждой строке, чтобы заставить его работать, но мне было интересно, если кто-нибудь может объяснить, почему расширение переменной Безразлично Не работай здесь.

ответ

2

Данные в $timer разбивается на $IFS (пространства), и используется в качестве отдельных аргументов. Он не расширяется, а затем оценивается как код bash.

Ваша команда $timer ls поэтому эквивалентно:

"/usr/bin/time" "-f" "'elapsed time:" "%E'" "--" "ls" 

правильный способ сделать это в вашем случае использования функции:

timer() { 
    /usr/bin/time -f 'elapsed time: %E' -- "[email protected]" 
} 
timer ls 

PS: Эта проблема автоматически указал shellcheck ,

1

Вы должны использовать массив BASH для хранения командной строки:

timer=(/usr/bin/time -f 'elapsed time: %E' --) 
"${timer[@]}" ls 
Смежные вопросы