Используйте bash, когда ksh является оболочкой

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_SIZElsкак , показанный @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 не допускаются

1
22.01.2020, 22:11
1 ответ

Код, который вы показываете, вполне может быть использован для запуска оболочки входа 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без спотыкания о возможных башизмах.

3
27.01.2020, 23:29

Теги

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