Объем переменных при вызывании функции от находки

$ man mkfs.ext4
The size of the  journal must be at least 1024 filesystem blocks (i.e., 1MB if using 1k blocks, 4MB if using 4k blocks, etc.)  and may be no more than 102,400 filesystem blocks.

Я думаю, что размер по умолчанию составляет 128 МБ, но не уверенный, который мог бы быть датирован. Так или иначе я не думаю, перемещая журнал в другой раздел на том же жестком диске, будет улучшение. Если Вы перемещаетесь в другой физический диск, который может помочь.

Лучшее, которое можно сделать, должно попробовать различные размеры и выдержать сравнение с текущим состоянием с реальной рабочей нагрузкой (не некоторый инструмент сравнительного теста, который может или не может моделировать операции, подобные реальной рабочей нагрузке).

3
27.08.2013, 17:25
4 ответа

Вы могли объявить variable как переменная среды, т.е.

export variable="Filename:"
3
27.01.2020, 21:09

Не ответ на Ваш вопрос, но не делайте:

find . -type f -exec bash -c 'myfunction "{}"' \;

Около того, что это не портативно, это также очень опасно, потому что имена файлов заканчивают тем, что были интерпретированы bash как окружают код. Рассмотрите, например, что произошло бы, если бы был названный файл $(rm -rf ~) там. Запишите это:

find . -type f -exec bash -c 'myfunction "$1"' find+bash {} \;

Или еще лучше (чтобы не выполнять тот bash на файл):

find . -type f -exec bash -c 'for file do
  myfunction "$file"; done' find+bash {} +

Теперь ответ на Ваш вопрос быть по теме:

Вы могли сделать:

{ find . -type f -exec printf '%s\0' {} + | while IFS= read -ru3 -d '' file; do
  myfunction "$file"; done 3<&0 <&4 4<&-; } 4<&0

Тем путем Вы звоните myfunction в токе bash оболочка, таким образом, Вы не должны экспортировать myfunction или выполненный дополнительный bash оболочки.

Если Ваш find поддержки -print0 предикат (как GNU, busybox и некоторый BSDs finds), можно заменить -exec printf '%s\0' {} + с -print0

6
27.01.2020, 21:09
  • 1
    , я вижу. Отметьте взятый. Я предполагал, что мой подход не был лучшим выбором. –  DustByte 27.08.2013, 18:12
  • 2
    Большой, спасибо. Я изучу Ваш обновленный ответ. –  DustByte 28.08.2013, 00:55

Я сделал бы это следующим образом

#!/bin/bash

myfunction() {
    local var="Filename: "
    local file=$1 
        echo "$var" "$file"
    }

export -f myfunction
    find . -type f -exec bash -c 'myfunction {}' \;

Объявите Вар как локальный и передача '{}' к функции, которая является $1 сначала позиционный параметр.

1
27.01.2020, 21:09
  • 1
    Переменная я хочу использовать в функции (var в Вашем примере), определяется вне функции в моем случае. –  DustByte 27.08.2013, 17:58
  • 2
    Несомненно, Вы определили глобальную переменную, но почему начиная с variable движение должно выполнить / часть самой функции. –  Valentin Bajrami 27.08.2013, 18:03
  • 3
    Ну, это было просто примером. В моем реальном сценарии переменная используется во многих местах, в особенности вне функции. А-ч –  DustByte 27.08.2013, 18:10

Когда Вы присваиваете переменной, она начинается как переменная оболочки. Для получения переменной среды, которая передается подпроцессам, необходимо экспортировать ее.

variable="Filename:"
export variable

Можно поместить присвоение на ту же строку как export: export variable="Filename:".

Переменная будет видима к оболочкам, запущенным find, но не функции. В ударе можно также экспортировать функции. Эта возможность не присутствует в ksh, тире и других оболочках, которые часто используются как sh потому что они быстрее и более минимизированы.

export -f myfunction    # bash only

Никогда не используйте {} в строке в find -exec … (или xargs …), если Вы не знаете, что Ваши имена файлов являются алфавитно-цифровыми. Если будут какие-либо специальные символы в именах файлов, то они будут проанализированы как таковые внутренней оболочкой. Вместо этого передайте имена файлов командной строке оболочки.

find . -type f -exec bash -c 'for x; do myfunction "$x"; done' _ {} +

С оболочками кроме удара определите функцию во внутренней оболочке или просто поместите ее код непосредственно.

С другой стороны, в ударе, можно использовать рекурсивный globbing вместо находки. Остерегайтесь тот удар пересекает символьные ссылки на каталоги.

variable="Filename:"
myfunction () { … }
shopt -s globstar dotglob
for x in **/*; do
  if [[ -f $x ]]; then myfunction "$x"; fi
done
1
27.01.2020, 21:09
  • 1
    Спасибо за информацию, Что первоначально смутило меня, был то, что переменная была действительно доступна при вызывании функции самостоятельно (не от find), например, наличие строки, говорящей просто myfunction "hello.txt". –  DustByte 28.08.2013, 12:46

Теги

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