Вы делаете две вещи неправильно в Вашем примере.
Пример с aes-128-cfb
:
(echo Hello world ; sleep 3) | openssl enc -aes-128-cfb -pass pass:test -bufsize 1 | openssl enc -d -aes-128-cfb -pass pass:test -bufsize 1
Пример с rc4
:
(echo Hello world ; sleep 3) | openssl enc -rc4 -pass pass:test -bufsize 1 | openssl enc -d -rc4 -pass pass:test -bufsize 1
Однако я должен указать, что сокращение размера буфера увеличит процессорное время, требуемое выполнить crypto операции:
% time sh -c 'dd if=/dev/urandom bs=8k count=1 | openssl enc -rc4 -pass pass:test | openssl enc -d -rc4 -pass pass:test > /dev/null'
1+0 records in
1+0 records out
8192 bytes transferred in 0.001175 secs (6972350 bytes/sec)
sh -c 0.01s user 0.01s system 167% cpu 0.009 total
% time sh -c 'dd if=/dev/urandom bs=8k count=1 | openssl enc -rc4 -pass pass:test -bufsize 1 | openssl enc -d -rc4 -pass pass:test -bufsize 1 > /dev/null'
1+0 records in
1+0 records out
8192 bytes transferred in 0.001070 secs (7655913 bytes/sec)
sh -c 0.02s user 0.03s system 187% cpu 0.027 total
С буфером 8K это только взяло 0,01 секундам каждого пользователя и системное время, но использование -bufsize 1
занял 0,02 и 0,03 секунды соответственно, общее количество 5x увеличение. Процент использования ЦП сообщил о значении, также увеличенном 20. Если это не проблема для Вас, затем любой ценой используют bufsize 1. Но если это будет, то затем необходимо будет сравнить его для нахождения лучшего размера для приложения.
Когда оболочка запускается, для каждой переменной окружения она получает действительное имя в качестве переменной оболочки, оболочка присваивает соответствующей переменной оболочки соответствующее значение. Например, если ваш скрипт запущен как:
(и имеет [114337]#! /bin/bash -[114338] she-bang), [114339]env[114340] выполнит [114341]/bin/bash[114342] и передаст [114343]VAR_A=xxx[114344] этой команде bash, а [114345]bash[114346] присвоит своей переменной [114347]$VAR_A[114348] значение [114349]xxx[114350].
В оболочке Борна и в C-оболочке, если вы присваиваете новое значение этой переменной оболочки, это не влияет на соответствующую переменную env, передаваемую последующим командам, выполняемым оболочкой, вы должны использовать для этого [114351]export[114352] или [114353]setenv[114354] (обратите внимание, однако, что в оболочке Борна, если вы [114355]unset[114356] присваиваете переменную оболочки, она удаляет и переменную оболочки, и переменную окружения). В:
In:
(с [114357]sh[114358] оболочкой Борна, а не современными POSIX оболочками) или:
другая команда[114360] получает [114361]VAR=xxx[114362] в своем окружении, а не [114363]VAR=yy[114364], вам нужно будет его записать:
или
Для того, чтобы [114365]другая команда [114366] получила [114367]VAR=yyy[114368] в своем окружении.
Однако, [114369]ksh[114370] (и POSIX в результате, а затем [114371]bash[114372] и все другие современные оболочки, похожие на Борна в результате) сломали это.
Это основная причина, по которой все заглавные переменные должны быть зарезервированы для переменных окружения.
Чтобы обойти это, если вы хотите, чтобы команды, выполняемые вашим скриптом, получали то же окружение, что и shell, интерпретирующий полученный вами скрипт, вам нужно как-то хранить это окружение. Вы можете сделать это, добавив:
Не совсем понятно, что вы спрашиваете как "локальная [114295]env переменная[114296]" - это противоречие. Переменные окружения являются глобальными, а не локальными.
У вас есть три типа переменных:
tar xfj filename.tar.bz2 | 7z a -si filename.7z
экспортируемые глобальные переменные (переменные окружения).
tar xfz filename.tar.gz | 7z a -si filename.7z
глобальные переменные.
глобальные переменные находятся в процессе оболочки. Любая функция оболочки, запущенная в этом процессе, может читать и изменять глобальные переменные. Экспортируемые переменные помещаются в окружение процесса и доступны дочерним процессам. Локальные переменные локальны для функции оболочки.Я думаю, что вы спрашиваете, можете ли вы получить доступ к переменной окружения, которая существует до вызова скрипта после того, как скрипт модифицирует переменную.
В чистом виде bash, вы не можете этого сделать. Когда сценарий запускается, все переменные окружения экспортируются глобальные переменные. Когда скрипт изменяет [114303]VAR_A[114304], он изменяется в окружении.
Если вы используете Linux, вы можете получить доступ к родительскому окружению через файловую систему [114305]proc[114306]. Родительский процесс обычно имеет исходную переменную окружения, которую вы ищете:
echo -n "Hello World "; uptime
Она извлечет переменную окружения [114307]VAR_A[114308] из окружения родительского процесса ([114309]$PPID[114310]) и распечатает только часть значения. Это зависит от того, сможете ли вы прочитать родительское окружение (тот же самый UID), и что родительская переменная имеет нужную вам переменную.[113859].
Следующий пример должен прояснить:
Запустите его:
Больше информации о [114250]local[114251] in bash можно прочитать со страницы [114252]man[114253] page:
Происходит то, что файл конфигурации VAR_A
перезаписывает содержимое VAR_A
поступает из .bashrc
.
Следовательно, решение напрашивается само собой: перед тем, как исходить из файла конфигурации, сохраните содержимое VAR_A
, как показано ниже.
VAR_A_sav=${VAR_A} # assuming that VAR_A_sav does NOT exist in configuration
. ../configuration # that is, you must choose a name not existing in config.
VAR_A=${VAR_A_sav}