Сеанс входа в систему 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
.
Решение, которое я нашел, заключалось в том, чтобы разделить 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"
Я бы посоветовал вместо этого использовать массив
var2=( "$var0" "$var1" )
du "${var2[@]}"