Справка с 64-разрядными целыми числами в сценариях?

Короткий ответ - использование:

 startx -- vt0

Более длительное объяснение: ссылки и предложения @JimParis привели меня рыть немного больше в PolicyKit и systemd, и - кардинально - к Google для "polkit startx", который привел меня к результату на Дуге сайт обсуждения Linux:

Если Вы не используете менеджера по оформлению, это означает, что у Вас не будет зарегистрированной pam сессии для Вашего графического входа в систему, что означает вошедший, не даст корректную информацию polkit (это будет думать, что нет никакой активной сессии).

Обходное решение для этого должно запустить Ваш WM на том же VT как Ваш consolelogin и следовательно "украсть" это pam сессия. Я полагаю, что волшебное колдовство:

# startx -- vt0

До сих пор я даже не заметил, что startx может взять аргументы, но это работает красиво на мою ситуацию. Мало того, что локальный пользователь может теперь присоединиться к беспроводным сетям правильно, но и имеет надлежащий доступ к другим настольным функциям Gnome, таким как Bluetooth и Приостанавливают.

2
10.01.2014, 20:48
2 ответа

Необходимо искать split; это может сделать то, что Вы хотите. (Кроме того, как @Marco примечания в его комментарии, не анализировать ls вывод; рассмотреть использование stat -f '%s' вместо этого), Если нет:

Вы не должны должны быть вычислять, ищут точки, позволяют дескриптору файла сделать это для Вас. Это - синтаксис удара:

for ((i = 0; i < n_blocks; ++i); do
    dd bs=4k count=262144
done < "input-file-name"

Так как ключевой пункт является отпуском, входной файл открывается как ddstdin, затем каждый раз dd чтения от него, он продолжится, где это кончило.

0
27.01.2020, 23:02
  • 1
    : Разделение..... не, которое не будет работать. Из-за потенциальных больших размеров файла, у меня не может быть больших копий файла, бродящего вокруг диска... следовательно я надеюсь использовать dd, чтобы извлечь один или два блока, обработать их, удалить.... промывку и повторение... –  user119886 10.01.2014, 20:38
  • 2
    @user119886 Кажется, что Вы ищете split --filter (если Ваше разделение имеет это), фильтр разделения –  derobert 10.01.2014, 20:41
  • 3
    .... звучит интересным, но выглядит GNU только, я смотрел/надеялся для создания довольно портативного сценария, который будет работать над BSD также, и разделение BSD' не получено фильтр.; - ( –  user119886 10.01.2014, 20:44
  • 4
    @user119886 подход leave-the-fd-open с dd должен быть портативным. Конечно, dd сама целая куча проблем. –  derobert 10.01.2014, 20:46

ATT ksh93, удар и тире (но не pdksh или mksh) и по крайней мере некоторые установки BusyBox поддерживают 64-разрядную арифметику даже на 32-разрядных платформах.

Вам не нужна 64-разрядная арифметика оболочки, пока Ваши файлы не больше, чем 4EB. Звонить bc раз и навсегда для подсчета количества блоков на 1 ГБ в файле затем звоните dd однажды на блок.

typeset size=$(ls -log -- "${1}" | awk 'NR==1 {print $3}')
typeset blocks=$(echo "($size - 1) / 1073741824" | bc)
typeset -i b
for ((b = 0; b < blocks; b++)); do
  dd if="$1" bs=1073741824 skip=$b | …
done

С другой стороны, можно звонить dd в цикле, с целым циклом, читающим из файла. Трудность замечает, когда вход пуст; dd говорит Вам на его стандартной погрешности.

while
  case "$({ LC_ALL=C dd bs=1048576 count=1024 2>&3 | … 1>&4; } 3>&1)" in
    '0+0 records in'*) false;;
  esac
do
  :
done <"$1" 4>&1

Если размер файла является точным несколько из размера блока, приложение запущено с пустым файлом в прошлый раз. Это кажется трудным избежать; неуклюжее решение состояло бы в том, чтобы считать следующий байт, хотя остерегаются этого, если Вы читаете его в переменную оболочки, необходимо заботиться, что, если это - пустой байт, Вы получаете пустую строку.

0
27.01.2020, 23:02

Теги

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