Вы можете принудительно выполнить еще один раунд оценки с помощью eval
, но на самом деле это не обязательно. (И eval
начинает иметь серьезные проблемы в тот момент, когда имена ваших файлов содержат специальные символы, такие как $
.) Проблема не в подстановке символов, а в раскрытии тильды.
Глобализация происходит после раскрытия переменной, если переменная не заключена в кавычки, как здесь (*) :
$ x="/tm*" ; echo $x
/tmp
Таким же образом, это похоже на то, что вы сделали , и работает:
$ mkdir -p ~/public/foo/ ; touch ~/public/foo/x.launch
$ i="$HOME/public/*"; j="*.launch"; k="$i/$j"
$ echo $k
/home/foo/public/foo/x.launch
Но с тильдой этого не происходит:
$ i="~/public/*"; j="*.launch"; k="$i/$j"
$ echo $k
~/public/*/*.launch
Это четко задокументировано для Bash:
Порядок раскрытия следующий: расширение скобок; раскрытие тильды, раскрытие параметров и переменных, ...
Раскрытие тильды происходит перед раскрытием переменной, поэтому тильды внутри переменных не раскрываются. Простое решение -
использовать вместо него $ HOME
или полный путь.
(* расширение глобусов из переменных обычно не то, что вам нужно)
Еще одна вещь:
Когда вы перебираете шаблоны, как здесь:
exclude="foo *bar"
for j in $exclude ; do
...
обратите внимание, что поскольку $ exclude
- это не заключенный в кавычки, он и разделен, и в этом месте тоже скопирован.Поэтому, если текущий каталог содержит что-то, что соответствует шаблону, оно расширяется до следующего:
$ i="$HOME/public/foo"
$ exclude="*.launch"
$ touch $i/real.launch
$ for j in $exclude ; do # split and glob, no match
echo "$i"/$j ; done
/home/foo/public/foo/real.launch
$ touch ./hello.launch
$ for j in $exclude ; do # split and glob, matches in current dir!
echo "$i"/$j ; done
/home/foo/public/foo/hello.launch # not the expected result
Чтобы обойти это, используйте переменную массива вместо разделенной строки:
$ exclude=("*.launch")
$ exclude+=("something else")
$ for j in "${exclude[@]}" ; do echo "$i"/$j ; done
/home/foo/public/foo/real.launch
/home/foo/public/foo/something else
В качестве дополнительного бонуса записи массива также может содержать пробелы без проблем с разделением.
Нечто подобное можно сделать с помощью find -path
, если вас не волнует, на каком уровне каталога должны быть целевые файлы. Например. чтобы найти любой путь, заканчивающийся на / e2e / *. js
:
$ dirs="$HOME/public $HOME/private"
$ pattern="*/e2e/*.js"
$ find $dirs -path "$pattern"
/home/foo/public/one/two/three/e2e/asdf.js
Мы должны использовать $ HOME
вместо ~
по той же причине, что и раньше, а $ dirs
необходимо не заключать в кавычки в командной строке find
, чтобы он был разделен, но $ pattern
следует заключить в кавычки, чтобы он случайно не расширился оболочка.
(Думаю, вы могли бы поиграть с -maxdepth
в GNU find, чтобы ограничить глубину поиска, если вам интересно, но это немного другая проблема.)
{{1} }
Чтобы немного пояснить, буферы относятся к данным, которые записываются--и память которых не может быть освобождена до завершения записи.
Кэш относится к данным, которые были прочитаны,--он хранится на случай, если его нужно будет прочитать снова, но может быть немедленно восстановлен, так как его всегда можно повторно -прочитать с диска..
Каноническим источником этой информации является/usr/src/linux/Documentation/filesystems/proc.txt
Buffers: Relatively temporary storage for raw disk blocks shouldn't get tremendously large (20MB or so) Cached: in-memory cache for files read from the disk (the page cache). Doesn't include SwapCached.
Вы также можете найти более подробную информацию здесь .
The Linux Page Cache ("Cached:" from meminfo ) is the largest single consumer of RAM on most systems. Any time you do a read() from a file on disk, that data is read into memory, and goes into the page cache(1.).
The buffer cache ("Buffers:" in meminfo) is a close relative to the dentry/inode caches.
Или проанализируйте исходный код, например этот .
Сумма buffers
является возвращаемым значением функцииnr_blockdev_pages(void)
long nr_blockdev_pages(void)
{
struct block_device *bdev;
long ret = 0;
spin_lock(&bdev_lock);
list_for_each_entry(bdev, &all_bdevs, bd_list) {
ret += bdev->bd_inode->i_mapping->nrpages;
}
spin_unlock(&bdev_lock);
return ret;
}
Суммаcached
:
global_page_state(NR_FILE_PAGES) – total_swapcache_pages – i.bufferram