2016-08-05 2 views
1

Я изучаю сценарий оболочки. И я хочу проверить размер каталогов (и файлов). Я сделал образец сценария какКак получить результаты командной строки командной строки за отправителем?

#!/bin/bash 

for dir in $(du ".") 
do 
    echo "dir = $dir" 
    read T_SIZE T_PATH <<< $dir 
    echo "T_SIZE = $T_SIZE" 
    echo "T_PATH = $T_PATH" 
done 

Структура каталогов в текущем каталоге имеет только одну директорию «a».

Результаты

dir = 4 
T_SIZE = 4 
T_PATH = 
dir = ./a 
T_SIZE = ./a 
T_PATH = 
dir = 16 
T_SIZE = 16 
T_PATH = 
dir = . 
T_SIZE = . 
T_PATH = 

Кажется, команда «дю» дает результаты дословно. Однако, я ожидал, команда «дю» дает результаты построчно, и я ожидал, что результаты сценария выше

dir = 4 
T_SIZE = 4 
T_PATH = ./a 
dir = 16 
T_SIZE = 16 
T_PATH = . 

Пожалуйста, скажите мне, что было неправильным или предложение мне.

спасибо.

+0

Действительно, я не совсем понял это. В то время как цикл, предложенный Джоном, был бы ответом. –

ответ

1

Чтобы прочитать вывод команды, как du, строка за строкой, попробуйте:

du . | while read size path 
do 
    echo "size=$size path=$path" 
done 

Или, если вы используете оболочку, такие как Баш, который поддерживает процесс замены:

while read size path 
do 
    echo "size=$size path=$path" 
done < <(du ".") 

Существует большая разница между этими двумя подходами. В первом выше цикл while выполняется в подоболочке и, таким образом, все его переменные переменных оболочки исчезают после завершения подоболочки. В последнем коде переменные оболочки остаются доступными после завершения цикла while.

1

Нужно использовать цикл while для последовательного итерации вывода по команде.

while read size dir; do 
    echo "$dir is $size bytes" 
done < <(du .) 

Даже это не удастся в редком, но законном случае с именем каталога, содержащим новую строку. Тем не менее, вы не можете этого сделать, если не использовать версию find, которая может выводить вывод с нулевым разделителем вместо du.

Смежные вопросы