Действительно ли возможно переопределить тильду (' ~ ', корневой каталог)?

mkdir $(seq --format 's%.0f' 1 50)

или если бы Вы хотите дополненные нулем числа (который был бы лучше для сортировки):

mkdir $(seq --format 's%02.0f' 1 50)

или:

mkdir s$(seq -s ' s' -w 1 50) - отметьте строку' незадолго до $(), без него первый созданный каталог будет всего '01', а не 's01'

и, наконец: mkdir $(printf "s%02i " $(seq 1 50))

seq от GNU Coreutils

странно, seq's --format или -f опция только позволяет двойные типы printf с плавающей точкой (как f и g. также странный шестнадцатеричный формат с плавающей точкой, что я никогда не находил использования для). Я понятия не имею почему. Было бы хорошо, если бы это также поддерживало другой printf(3) числовые типы как целое число (d, i), восьмеричный (o, U) или шестнадцатеричное число (x, X).

Так или иначе, двойной формат с 0 десятичной точностью как %.0f или %02.0f достаточно близко к целому числу с этой целью.

$ seq --help
Usage: seq [OPTION]... LAST
  or:  seq [OPTION]... FIRST LAST
  or:  seq [OPTION]... FIRST INCREMENT LAST
Print numbers from FIRST to LAST, in steps of INCREMENT.

  -f, --format=FORMAT      use printf style floating-point FORMAT
  -s, --separator=STRING   use STRING to separate numbers (default: \n)
  -w, --equal-width        equalize width by padding with leading zeroes
      --help     display this help and exit
      --version  output version information and exit

If FIRST or INCREMENT is omitted, it defaults to 1.  That is, an
omitted INCREMENT defaults to 1 even when LAST is smaller than FIRST.
FIRST, INCREMENT, and LAST are interpreted as floating point values.
INCREMENT is usually positive if FIRST is smaller than LAST, and
INCREMENT is usually negative if FIRST is greater than LAST.
FORMAT must be suitable for printing one argument of type `double';
it defaults to %.PRECf if FIRST, INCREMENT, and LAST are all fixed point
decimal numbers with maximum precision PREC, and to %g otherwise.

См. также: http://www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html

13
26.08.2014, 14:26
3 ответа

Тильда ~ интерпретируется Вашей оболочкой. Ваша оболочка интерпретирует ~ как краткая форма $HOME.

Попробовать (echo ~; HOME=foo; echo ~). Это должно сначала распечатать Ваш реальный корневой каталог и впоследствии "нечто", поскольку Вы устанавливаете $HOME к этому.

Значение по умолчанию $HOME прибывает от Вас конфигурация системы. Использовать getent passwd перечислять всех известных пользователей и их корневые каталоги. В зависимости от Вашей конфигурации системы те записи могли бы прибыть из /etc/passwd или любая удаленная служба каталогов.

Если Вы только хотите временно переопределить свой корневой каталог, просто установите другого $HOME.

Если Вы постоянно хотите изменить его, необходимо изменить passwd запись, например, путем ручного редактирования /etc/passwd.

28
27.01.2020, 19:52
  • 1
    Спасибо, @michas. Не может полагать, что я пропустил ту переменную. (BTW, складывается в csh следующая переменная $home (нижний регистр), и Вы не можете setenv HOME /ext1/acheong— Вы можете только set home=/ext1/acheong, и это работало на меня.) –  Andrew Cheong 04.12.2013, 16:50
  • 2
    Для изменения его постоянно можно также использовать usermod -d –  user606723 04.12.2013, 17:02
  • 3
    vipw (или безотносительно GUI Ваша ОС обеспечивает) вместо редактирования /etc/passwd непосредственно. Прямое редактирование рискует повреждать файл, с которого может быть трудно восстановить. –  Keith Thompson 04.12.2013, 22:45

Значение, которое используется для ~ определяется от значения, которое Вы получаете от административной базы данных (getent passwd), обычно в /etc/passwd файл, для корневого каталога каждого пользователя это определяется там.

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
sam:x:500:500:Sam Mingolelli:/home/sam:/bin/bash
tracy:x:501:501::/home/tracy:/bin/bash

6-й столбец в этом файле - то, где значение использовало, когда кто-то вводит cd ~ прибывает из.

nsswitch

Вы видите то, что система использовала бы для корневого каталога пользователя с помощью команды getent passwd:

$ getent passwd
root:x:0:0:root:/root:/bin/bash
sam:x:500:500:Sam Mingolelli:/home/sam:/bin/bash
tracy:x:501:501::/home/tracy:/bin/bash

"Базой данных", которая обеспечивает их, управляют через Ваш системный сопоставитель, определенный в /etc/nsswitch.conf.

$ grep passwd /etc/nsswitch.conf 
#passwd:    db files nisplus nis
passwd:     files

Файлы выше средств /etc/passwd, но "база данных" могла прибыть из LDAP, NIS или других местоположений по сети, например.

Перемещение/Переопределение?

Выполнить эту операцию немного хитро после того, как учетные записи были созданы. При создании учетных записей с нуля затем, это тривиально для переопределения местоположения пользователя их корневого каталога. При выполнении useradd команда можно указать местоположение, которое будет использоваться для корневого каталога пользователя.

Пример

$ useradd -d /ext1/acheong ...

выборка из страницы справочника

-d, --home HOME_DIR
   The new user will be created using HOME_DIR as the value for the user’s 
   login directory. The default is to append the LOGIN name to BASE_DIR and 
   use that as the login directory name. The directory HOME_DIR does not 
   have to exist but will not be created if it is missing.

Для существующих учетных записей?

Это становится большим количеством хирургической операции с тех пор часто времена, путь корневого каталога пользователя включен статически в конфигурационных файлах, делая ее более хитрой.

Пример

$ grep home /home/sam/.*
/home/sam/.gtkrc-1.2-gnome2:include "/home/sam/.gtkrc.mine"

Они должны будут или быть зафиксированы, или необходимо будет предоставить ссылку от /home/sam к новому местоположению, /ext1/sam.

Перемещение, когда "база данных" не /etc/passwd

Если система получит корневые каталоги от LDAP, NIS, то и т.д. затем необходимо будет выполнить перемещение в тех системах и скоординировать с перемещением файлов от /home/sam кому: /ext1/sam.

Ссылки

11
27.01.2020, 19:52
  • 1
    Конечно, изменение, которое потребует перемещения файлов пользователя. И вероятно оставляя символьную ссылку в старом месте (поскольку иначе много вещей повредится...) –  derobert 04.12.2013, 15:54
  • 2
    @derobert - да сделавший это несколько раз я стараюсь избегать его как эпидемия. –  slm♦ 04.12.2013, 16:01
  • 3
    @slm - Спасибо за такой подробный ответ (и бит истории). Я боюсь, что надеялся делать что-то намного более простое — и я был не осведомлен существованию переменной среды, представляющей корневой каталог сессии. Я уверен, что Ваш ответ поможет другому читателю в будущем, как бы то ни было. Еще раз спасибо. –  Andrew Cheong 04.12.2013, 16:48

Если необходимо распределить пользователей по нескольким файловым системам, можно также использовать automounter. И даже позволит вам иметь разные "базовые" каталоги для ваших пользователей.

1
27.01.2020, 19:52

Теги

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