ls -s
сообщает член st_blocks
структуры, возвращаемый системными вызовами stat()
/lstat()
. Это число 512 -байтовых блоков. 512 байт обычно являются минимальной степенью детализации хранилища, поскольку это соответствует ранним секторам диска.
По крайней мере, это то, что делает большинство ls
реализаций, включая исходную реализацию Unix, и то, что требует POSIX.
Реализация GNUls
(также busybox
, которая имитирует ее, обе найдены в Ubuntu ), однако изменена на 1024 -байтовых блока, но возвращается к 512 -байтовым блокам, если$POSIXLY_CORRECT
(ранее$POSIX_ME_HARDER
)переменная находится в среде (не для busybox ). Я предполагаю, что это делается для того, чтобы сделать его более читаемым для человека, но это означает, что мы теряем точность в файловых системах, которые используют гранулярность хранения 512 -байт, и не помогают с переносимостью.
Из журнала изменений:
Wed Aug 21 13:03:14 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
Version 3.0.
du.c, ls.c: Make 1K blocks the default size, and -k a no-op. Down with dumb standards!
В GNUls
(not busybox )размер блока также можно указать с помощью опции --block-size
или переменной окружения $LS_BLOCK_SIZE
. Таким образом, вы можете использовать ls --block-size=1 -s
или LS_BLOCK_SIZE=1 ls -s
, чтобы получить использование диска в байтах. В других реализациях ls
, таких как BSD, используется $BLOCKSIZE
для этого¹ (, также распознаваемый GNU, а также $BLOCK_SIZE
ls
как , показанный @yahol).
В соответствии с POSIX вы можете использовать -k
для получения значения в кибибайтах (, которое, к счастью, в GNU или BSD ls
имеет приоритет над $BLOCKSIZE
переменными окружения ).
Переносимо (, если вы хотите принять во внимание busybox ls
, где отчет в кибибайтах жестко запрограммирован ),чтобы вернуться кst_blocks
(или хотя бы приблизительному ), вам понадобится что-то вроде:
blocks=$(ls -skd -- "$file" | awk '{print $1*2; exit}')
В GNU find
, -printf %b
сообщает количество блоков по 512 -байтов, а -printf %k
блоков по 1024 -байт, и на него не влияет среда. -printf
относится к GNU.
В любом случае, в настоящее время это никак не связано с размером блока файловой системы.
¹ В BSD $BLOCKSIZE
округляется до кратного 512(BLOCKSIZE=1023
равноBLOCKSIZE=512
)и значения ниже 512 не допускаются
Код, который вы показываете, вполне может быть использован для запуска оболочки входа bash
из вашего файла ~/.profile
. Лично я бы использовал command
для обнаружения присутствия bash
вот так:
if [ -z "$BASH" ]; then
shell=$( command -v bash )
if [ -n "$shell" ]; then
exec env SHELL="$shell" bash --login
fi
unset shell
echo 'Bash not present, continuing...' >&2
fi
Получает путь к bash
в $shell
, который затем используется для проверки доступности bash
и для установки переменной окружения SHELL
для bash
.
Использование [ ! -n "$BASH" ]
или [ -z "$BASH" ]
не имеет особого значения (, поэтому делайте то, что кажется правильным и наиболее простым для чтения ), но я бы, вероятно, не использовал ! [ "$BASH" ]
или [ ! "$BASH" ]
. В общем случае вы можете проверить строки, начинающиеся с тире, что может запутать тест, поэтому лучше придерживаться -n
или -z
при проверке того, являются ли строки пустыми или нет.
Вы также можете оставить ~/.profile
практически нетронутым (, за исключением вышеупомянутого ), если системные администраторы однажды решат удалить bash
и вместо этого написать отдельный ~/.bash_profile
файл. Оболочка bash
будет использовать ~/.bash_profile
, если она доступна, вместо ~/.profile
, а сбой при запуске bash
приведет к тому, что ваша оболочка входа в систему по умолчанию успешно использует ~/.profile
без спотыкания о возможных башизмах.