То, как я могу вынудить удар освободить фигурную скобку, развернуло переменную без имени?

Веб-приложение Word является бесплатным, и можно использовать его от браузера на Linux. Это произведет к docx и odt. Существует значительный код Codeplex, SourceForge, и др. который может помочь с преобразованием существующего чему-то в OpenXML. Если получатели используют Office 2007 SP2 или более новые, или у них есть Windows 7 или Windows 8 WordPad, они могут открыть Ваш ODT.

5
13.04.2017, 15:36
2 ответа

Итак, я сделал это в тестировании и, да, он потребляет много памяти. Я уже указывающе использовал меньшее число. Я могу представить, что Bash Bash Участвует эти ресурсы в течение нескольких дней, может быть немного раздражать.

ps -Fp "$$"; : {1..10000000}; ps -Fp "$$"

UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
mikeserv 32601  4241  0  3957  3756   4 08:28 pts/1    00:00:00 bash -l
UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
mikeserv 32601  4241 59 472722 1878712 4 08:28 pts/1   00:00:28 bash -l

Как вы можете видеть, существует значительное влияние на потребляемые ресурсы процесса. Ну, я постараюсь очистить это, но - насколько я могу сказать, - это потребует замены процесса оболочки с другим.

Во-первых, я установлю маркерную переменную, чтобы показать, что она поставляется со мной. Примечание: это не Экспорт Ed.

var='just
testing
'\''
this stuff
'\'''

Далее я должен работать $ 0 . Это то же самое, что давно работающие демоны иногда должны преодолевать их состояние. Здесь имеет смысл.

Первый метод: здесь-документ

Я буду использовать текущую оболочку для создания файла входного файла Heredoc для вновь EXEC ED, который будет содержать все объявленные переменные оболочки. Отказ Вероятно, это может быть сделано по-другому, но я не знаю все подходящие коммутаторы командной линии для Bash .

Новая оболочка вызывается с помощью коммутатора -L -L -L ogin, который увидит к нему, что ваши файлы / RC будут получены на обычном - и какие другие варианты оболочки в настоящее время Установите и хранятся в специальном параметре Shell $ - . Если вы чувствуете -L -L Ogin - это не правильный способ перехода, а затем использовать коммутатор -I , должен, по крайней мере, получить файл RC .

exec "${0#-}" "-l$-" 3<<ENV
$(set)
ENV

Хорошо. Это только заняло секунду. Как это работает?

. /dev/fd/3 2>/dev/null
echo "$var"; ps -Fp "$$"

just
testing
'
this stuff
'
UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
mikeserv 32601  4241 12  4054  3800   5 08:28 pts/1    00:00:29 bash -lhimBH

просто нормально, как это казалось. <& 3 зависает на входе нового процесса оболочки, пока он не будет прочитан - поэтому я делаю это с . и источник. Он, вероятно, будет содержать несколько переменных только для чтения по умолчанию, которые уже были установлены в новой оболочке по его RC файлы и и т. Д., Итак, будут несколько ошибок - но я бросает, что на 2> / dev / null . После этого, как вы можете видеть, у меня есть все переменные процесса старого раковины здесь со мной - включить мой маркер $ var .

Второй метод: переменные среды

после выполнения Google или двух по этому вопросу, я думаю, что это может быть еще один способ, который стоит учитывать. Я изначально рассмотрел это, но (, по-видимому, ошибочно ) собеседна этот вариант на основе убеждения в том, что произошло принудительное ядро ​​произвольной длины до единой ценности переменной среды - что-то вроде Аргелен или LineMax (который, вероятно, повлияет на это) , но меньше за одно значение. Тем не менее, я правильно, это то, что вызов Execve не будет работать, когда общая среда слишком велика. И вот, я считаю, что это должно быть предпочтительным только в том случае, если вы можете гарантировать, что ваша текущая среда достаточно мала, чтобы разрешить вызов .

На самом деле это достаточно иначе, что я сделаю все это снова в одном.

ps -pF "$$"; : {1..10000000}; ps -pF "$$"

UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
mikeserv 26296  4241  0  3957  3788   3 14:28 pts/1    00:00:00 bash -l
UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
mikeserv 26296  4241 38 472722 1878740 3 14:28 pts/1   00:00:11 bash -l

Одна вещь, которую я не смог сделать на первом раунде, - это мигрировать функции оболочки. Не считая отслеживания их самостоятельно (который, вероятно, лучший способ) , насколько мне известно, не существует портативный способ сделать это. Bash позволяет ему допустить, хотя, поскольку объявляет -F работает так же одинаково для функций, которые множество делает для переменных оболочек портативно. Для этого, а также с первым методом, который вам нужно только добавить ; DECLARE -F по установлению в здесь документе.

Моя переменная маркера останется прежней, но вот моя функция маркера:

chk () {
    printf '###%s:###\n%s\n' \
        \$VAR "${var-NOT SET}" \
        PSINFO "$(ps -Fp $$)" \
        ENV\ LEN "$(env | wc -c)"
}

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

varstate=$(set) fnstate=$(declare -f) exec "${0#-}" "-l$-"

ОК. Так что я только что заменил бегущую оболочку, так что теперь что?

chk
bash: chk: command not found

, конечно. Но ...

{   echo '###EVAL/UNSET $FNSTATE###'
    eval "$fnstate"; unset fnstate
    chk
    echo '###EVAL/UNSET $VARSTATE###'
    eval "$varstate"; unset varstate
    chk
}

Выход

###EVAL/UNSET $FNSTATE###
###$VAR:###
NOT SET
###PSINFO:###
UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
mikeserv 26296  4241 10  3991  3736   1 14:28 pts/1    00:00:12 bash -lhimBH
###ENV LEN:###
6813
###EVAL/UNSET $VARSTATE###
bash: BASHOPTS: readonly variable
bash: BASH_VERSINFO: readonly variable
bash: EUID: readonly variable
bash: PPID: readonly variable
bash: SHELLOPTS: readonly variable
bash: UID: readonly variable
###$VAR:###
just
testing
'
this stuff
'
###PSINFO:###
UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
mikeserv 26296  4241 10  4056  3772   1 14:28 pts/1    00:00:12 bash -lhimBH
###ENV LEN:###
2839
6
27.01.2020, 20:38

Нет. Бэш никогда не вернёт операционной системе память, которую он выделяет для каких-либо целей. (Но, пожалуйста, поправьте меня, если я ошибаюсь.)

Однако, при необходимости, bash будет повторно использовать память для других целей, а если нет, то кернел подкачает её, так что на самом деле она не будет в оперативной памяти.

0
27.01.2020, 20:38

Теги

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