Получить общий размер нескольких файлов из переменной, содержащей список файлов

Сеанс входа в систему sh читает ~ / .profile пользователя при вызове. Если после этого в переменной ENV установлено имя файла, и если этот файл существует, оболочка будет использовать этот файл для дальнейшей инициализации сеанса входа в систему.

Интерактивные оболочки, которые не являются оболочками входа в систему, будут использовать только $ ENV , если установлено ENV , но не будут читать ~ / .profile .

Неинтерактивная оболочка не должна использовать ни один из этих двух файлов.

Обычно ENV экспортируется в конце своего ~ / .profile :

ENV="$HOME/.shrc"     # for example
export ENV            # may be done as export ENV="..." too, in most shells.

Это, например, то, что делает bash , если он вызывается как sh или с помощью bash --posix .

Можно использовать эти два файла ( ~ / .profile и $ ENV ) для чего угодно, но в профиле вы можете установить и экспортировать переменные среды, которые необходимо установить только один раз ( ПУТЬ и т. д.), запустите любой процесс fetchmail или другой пользовательский демон, который вы хотите использовать и т. д., в то время как файл $ ENV - это то место, где вы настраиваете определенные вещи для этого конкретного сеанса оболочки / TTY. , например, установка GPG_TTY (если вы используете GnuPG), установка псевдонимов (поскольку псевдонимы не наследуются подоболочками) и т. д.

Оболочка ksh93 использует ~ / .profile и $ ENV по умолчанию, но интерпретирует $ ENV определенным образом. Если $ ENV начинается с /./ или ././ , то общесистемный файл конфигурации использоваться не будет (например, /etc/ksh.kshrc).

Файл ~ / .login не используется sh , если только ENV не установлен на это имя файла или он явно не получен из ~ /.profile или $ ENV .

1
02.10.2016, 17:16
2 ответа

Решение, которое я нашел, заключалось в том, чтобы разделить var2 построчно в цикле while :

#!/bin/bash
var0="/tmp/a0 1"
var1="/tmp/a1 1"
var2="$(echo -e "$var0\n$var1")"

totalsize=0;                                    #this will make script return 0 if var2 somehow contains empty lines only
while read "opened_file"                        #for each file in list do
do
        if [ ! -z "$opened_file" ]; then        #if variable is not empty
                tmp1="$(du -b "$opened_file" | cut -d"  " -f1)"         #get size of current file and strip unnecessary fields
                totalsize=$(($totalsize + $tmp1))
        fi
done <<< "$(echo -e "$var2")"
echo "$totalsize"
0
27.01.2020, 23:25

Я бы посоветовал вместо этого использовать массив

var2=( "$var0" "$var1" )

du "${var2[@]}"

См. BashGuide / Arrays

3
27.01.2020, 23:25

Теги

Похожие вопросы