-k All assignment arguments are placed in the environment for a command, not just those that precede the command name.
То есть, при активации этой настройки, все что будет похоже на присваивание переменным значений, поместиться в среду команд. И совершенно не важно, где в строке находится это присваивание.
Короче говоря, если в команде используется синтаксис присваивания (HUY=512), то эта команда не получит этих присвоенных опций в качестве аргументов. Чтобы стало понятнее, давай на практике.
set -k
dd if=/dev/zero of=/dev/null count=1 bs=2048
По идее, команда dd должна прочитать блок размером 2048 байта из устройства /dev/zero и записать эти байты в устройство /dev/null. А после выполнения — завершить работу.
На экран должны получить нечто подобное:
1+0 records in
1+0 records out
2048 bytes (1.0 kB, 1.0 KiB) copied, 9.4642e-05 s, 10.8 MB/s
Но так как мы выполнили «set -k», все будет иначе. Утилита dd не получит указанных опций в качестве аргументов и будет пытаться читать и писать блоками по 512 байт (512 по умолчанию). После выполнения команды, мы получаем — Хуй с маслом! Ничего! Хотя ожидали получить — завершение работы.
Выполнив «set -k» утилита dd просто заблокировалась на чтении стандартного потока ввода и ожидает данные. Вот такие перлы!
Обожаю угорать над студентами, сначала втихую активируем «set -k» и просим решить простую задачку со звездочкой. Но задачка почему-то не решается. А дальше начинается гогул, strace и бессонные ночи.
Если нарвался на подобное поведение, как вариант, проверь этот самый «set -k». Деактивировать эту фигню, так: «set +k».
Всегда ору с этого синтаксиса, плюс = отключить, минус = включить.
Для чего вообще нужна «set -k» и где применяется? Возможно для фоновых процессов, ну либо угорать над студентами. Если знаешь истинное применение, пиши в комменты, будет интересно.
Давай, увидимся вечером, хорошего тебе дня!
tags: #bash
—
💩 @bashdays